--方法1,支持表

--plsql中将long类型隐式转换为varchar2,但是sql不能
CREATE OR REPLACE FUNCTION LONG_TO_CHAR(
in_rowid rowid,
in_owner varchar,
in_table_name varchar,
in_column varchar2)
RETURN varchar AS
text_c1 varchar2(32767);
sql_cur varchar2(2000);
--set serveroutput on size 10000000000;
begin
DBMS_OUTPUT.ENABLE (buffer_size=>null);
sql_cur := 'select '||in_column||' from '||in_owner||'.'||in_table_name||' where rowid = '||chr(39)||in_rowid||chr(39);
dbms_output.put_line (sql_cur);
execute immediate sql_cur into text_c1;
text_c1 := substr(text_c1, 1, 4000);
RETURN TEXT_C1;
END;
/
--------------------------------------
--test
-- 参数分别为 rowid,用户,表名,字段名
DROP TABLE VI.TEST1;
CREATE TABLE VI.TEST1(ID NUMBER,V_CLOB CLOB,V_LONG LONG DEFAULT 'create or replace view v_t',V_SYSDATE DATE DEFAULT SYSDATE);
INSERT INTO VI.TEST1(ID) SELECT 1 FROM DUAL;
COMMIT;

select LONG_TO_CHAR(ROWID, 'VI', 'TEST1', 'V_LONG') FROM TEST1;

-------------------------------------------------------------------------------------------------------------------------------------------------

--方法2,支持表和视图

--long查询结果转换为varchar2类型
/*来自Thomas Kyte 《Oracle9i/10g/11g编程艺术》 12章节中.由于long的操作限制,那么在操作long之前可以将该类型的结果转换为varchar2,
然后再使用long_help.substr_of,基本意思是将long结果的的前4000字节转换为varchar2类型.如果long的数据超过了4000字节,那么可以将循环调用此函数
*/

create or replace package long_help
authid current_user
as
function substr_of(
p_query in varchar2,
p_from in number,
p_for in number,
p_name1 in varchar2 default NULL,
p_bind1 in varchar2 default NULL,
p_name2 in varchar2 default NULL,
p_bind2 in varchar2 default NULL,
p_name3 in varchar2 default NULL,
p_bind3 in varchar2 default NULL,
p_name4 in varchar2 default NULL,
p_bind4 in varchar2 default NULL
)
return varchar2;
end;
/

create or replace package body long_help
as
g_cursor number := dbms_sql.open_cursor;
g_query varchar2(32765);

procedure bind_variable(
p_name in varchar2,
p_value in varchar2
)
is
begin
if ( p_name is not null) then
dbms_sql.bind_variable( g_cursor, p_name, p_value );
end if;
end;

function substr_of(
p_query in varchar2,
p_from in number,
p_for in number,
p_name1 in varchar2 default NULL,
p_bind1 in varchar2 default NULL,
p_name2 in varchar2 default NULL,
p_bind2 in varchar2 default NULL,
p_name3 in varchar2 default NULL,
p_bind3 in varchar2 default NULL,
p_name4 in varchar2 default NULL,
p_bind4 in varchar2 default NULL)
return varchar2 as
l_buffer varchar2(4000);
l_buffer_len number;
begin
if ( nvl(p_from,0) <= 0 ) then
raise_application_error(-20002, 'From must be >= 1 (positive numbers)');
end if;
if ( nvl(p_for,0) not between 1 and 4000 ) then
raise_application_error (-20003, 'For must be between 1 and 4000' );
end if;
if ( p_query <> g_query or g_query is NULL ) then
if ( upper(trim(nvl(p_query,'x'))) not like 'SELECT%') then
raise_application_error(-20001, 'This must be a select only' );
end if;
dbms_sql.parse( g_cursor, p_query, dbms_sql.native );
g_query := p_query;
end if;
bind_variable( p_name1, p_bind1 );
bind_variable( p_name2, p_bind2 );
bind_variable( p_name3, p_bind3 );
bind_variable( p_name4, p_bind4 );
dbms_sql.define_column_long(g_cursor, 1);
if (dbms_sql.execute_and_fetch(g_cursor)>0) then
dbms_sql.column_value_long(g_cursor, 1, p_for, p_from-1,l_buffer, l_buffer_len );
end if;
return l_buffer;
end substr_of;
end;
/

--使用方法:

--查询DBA_TAB_PARTITIONS中的LONG类型:HIGH_VALUE
SELECT * FROM(
SELECT TABLE_OWNER,TABLE_NAME,PARTITION_NAME,
LONG_HELP.SUBSTR_OF('SELECT HIGH_VALUE FROM DBA_TAB_PARTITIONS WHERE TABLE_OWNER=:TABLE_OWNER AND TABLE_NAME=:TABLE_NAME AND PARTITION_NAME=:PARTITION_NAME',
1,
4000,
'TABLE_OWNER',
TABLE_OWNER,
'TABLE_NAME',
TABLE_NAME,
'PARTITION_NAME',
PARTITION_NAME) HIGH_VALUE
FROM DBA_TAB_PARTITIONS
);

--查询long类型数据

SELECT LONG_HELP.SUBSTR_OF('SELECT V_LONG FROM TEST1',1,4000) FROM TEST1;

--查询DBA_VIEWS视图的 TEXT时报错:ORA-01006:绑定变量不存在(原因可能是不支持视图,应该在外层写筛选条件)
-------------------------------------------------------------------------------------------------------------------------------------------------

--方法三,支持表

select sys.dbms_metadata_util.long2varchar(100,'scott.t1','name',rowid) from scott.t1;
-------------------------------------------------------------------------------------------------------------------------------------------------

--varchar2转化为long,撰写的procedure案例如下
create table erpmainbom(
location varchar2(4000),
locationplus long,
parentpn varchar2(4000),
pn varchar2(4000),
plant varchar2(4000)
);

--location字段空格之前的字符重新复制给location,从空格开始的之后的字符拼接locationplus(long类型)字段并复制给locationplus

Create or replace PROCEDURE P_UPDATELOCALPLUS(
strMitm in varchar2,
strSubITEM in varchar2,
strPlant in varchar2)
as
lLocationPlus long;
strLocation varchar2(4000);
strSubLoc varchar2(50);
lTempLoct long;
i number;
Begin
Select location,locationplus into strLocation,lLocationPlus from erpmainbom Where parentpn=strMitm and pn=strSubITEM and plant= strPlant;
If length(strLocation)=4000 then
i:=1;
strSubLoc:=substr(strLocation,4000,i);
While InStr(strSubLoc, ' ') = 0 Loop
i := i + 1;
strSubLoc := substr(strLocation,4000-i,i);
End Loop;
--i:=i+1;
strSubLoc := substr(strLocation,4000-i,i+1);
strLocation := substr(strLocation,1, 4000 - Length(strSubLoc));
lTempLoct:=strSubLoc;
End if;
lLocationPlus:=lTempLoct||lLocationPlus;
update erpmainbom set location=strLocation,locationplus=lLocationPlus where parentpn=strMitm and pn=strSubITEM and plant= strPlant;
commit;
EXCEPTION When others then
Rollback;
end;
/

LONG数据类型转换为VARCHAR2并相互转换的更多相关文章

  1. go中基本数据类型转换为string类型的方法

    代码 // 基本数据类型转换为string类型 package main import ( "fmt" "strconv" ) func main() { // ...

  2. VC++和C语言中常见数据类型转换为字符串的方法

    1.短整型(int) itoa(i,temp,10);///将i转换为字符串放入temp中,最后一个数字表示十进制 itoa(i,temp,2); ///按二进制方式转换 2.长整型(long) lt ...

  3. windows 数据类型转换为 dotnet 数据类型

    Windows Data Type .NET Data Type BOOL, BOOLEAN Boolean or Int32 BSTR String BYTE Byte CHAR Char DOUB ...

  4. 将float数据类型转换为str

    示例程序: #include <stdio.h> . . void UART_send_byte(char dat); void UART_send_string(unsigned cha ...

  5. js关于if()else{}中的判定条件的认识,各种数据类型转换为Boolean类型的转换规则

    博客搬迁,给你带来的不便敬请谅解! http://www.suanliutudousi.com/2017/09/24/js%E5%85%B3%E4%BA%8Eifelse%E4%B8%AD%E7%9A ...

  6. oracle数据类型

    本文转自:http://blog.csdn.net/defonds/article/details/4302695 谢谢原文作者 有道是,磨刀不误砍柴工.多了解一些底层的东西,对于Oracle开发.维 ...

  7. java中数据类型及运算符的注意事项

    数据类型: boolean 类型数据只允许取值true 或 false(不可以使用0 或非0的整数来代替true和false,区分于C语言). char:Java中用" \u四位十六进制的数 ...

  8. Spark(Hive) SQL数据类型使用详解(Python)

    Spark SQL使用时需要有若干“表”的存在,这些“表”可以来自于Hive,也可以来自“临时表”.如果“表”来自于Hive,它的模式(列名.列类型等)在创建时已经确定,一般情况下我们直接通过Spar ...

  9. Java学习6——基本数据类型及其转换

    Java常量: Java的常量值用字符串表示,区分不同的数据类型 整型常量123.浮点型常量3.14.字符常量'a'.逻辑常量true.字符串常量"helloworld". ps: ...

随机推荐

  1. daemon_init函数:调用该函数把普通进程转变为守护进程

    #include <unistd.h> #include <syslog.h> #include <fcntl.h> #include <signal.h&g ...

  2. CTF 湖湘杯 2018 WriteUp (部分)

    湖湘杯 2018 WriteUp (部分),欢迎转载,转载请注明出处! 1.  CodeCheck(WEB) 测试admin ‘ or ‘1’=’1’# ,php报错.点击登录框下面的滚动通知,URL ...

  3. PHP之字符串匹配

    strstr(string,search): strstr() 函数搜索一个字符串在另一个字符串中的第一次出现. 该函数返回字符串的其余部分(从匹配点).如果未找到所搜索的字符串,则返回 false. ...

  4. 迅为4412开发板QtE系统源码-屏幕横竖屏切换修改方法

    迅为4412开发板QtE系统源码-屏幕横竖屏切换修改方法 详情了解:http://topeetboard.com 更多了解:https://arm-board.taobao.com/ 用户在开发板上运 ...

  5. luogu P3767 膜法

    传送门 这题如果没有删除操作,可以直接使用可持久化并查集 注意到这种可持久化的依赖关系(是这样说的把)是一棵树,然后对于一个点,自己的操作会影响自己的那棵子树,并且如果是删除操作,就会使得一个子树没有 ...

  6. EcustOJ P109跳一跳(离散化+dp)

    题目链接 感觉这道题我看了很多天,胡思乱想啊,一开始觉得记忆化搜索会可能T啊,,可能出题人的数据卡的好就稳T了的感觉..后来想了想,好像离散化一下,记一下位置之后再记忆化搜索就应该稳了吧..(好像直接 ...

  7. rpmlib(PayloadIsLzma) <= 4.4.6-1 is needed【转载】

    以下为转载,但是有改动,原作者在一处写错了,将高写成了低,直接差之毫厘,谬之千里. 环境: centos el5 背景: 由于个人比较喜欢用软件的最新版本,在重新安装服务器上的 xdg-open(还有 ...

  8. 使用AOP AspectJ 定义@Before,@After ,@Aroud后 执行两次

    背景 转眼之间,发现博客已经将近半年没更新了,甚是惭愧.话不多说,正如标题所言,最近在使用AspectJ的时候,发现拦截器(AOP切面)执行了两次了.我们知道,AspectJ是AOP的一种解决方案,本 ...

  9. MySql cmd下的学习笔记 —— 有关多表查询的操作(多表查询练习题及union操作)

    先建立一张 m 表 mysql> create table m ( -> mid int, -> hid int, -> gid int, ), -> matime da ...

  10. javascript/ajax和php 进阶 之 项目实战

    1,使用异步思想做一个下拉列表,能够选择和展示数据库中对应的信息. 1,事件知识:所有的事件可参照:https://www.jb51.net/html5/459444.html 2,js中this补充 ...