--方法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. 【noip 2012】提高组Day1T3.开车旅行

    Description 小A和小B决定利用假期外出旅行,他们将想去的城市从1到N编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市i 的海拔高度为Hi,城市i 和城市 ...

  2. VS中ipch文件夹和sdf文件的处理方式

    ipch文件夹和sdf是VS产生的预编译头文件和智能提示信息,对编码没有影响,可存放在固定的位置,定期进行清理

  3. asp.net mvc 多文件上传

    @{ ViewBag.Title = "多文件上传测试"; } <h2>多文件上传测试</h2> <form action="/Demo/I ...

  4. Java SE之XML<二>XML DOM与SAX解析

    [文档整理系列] Java SE之XML<二>XML DOM与SAX解析 XML编程:CRUD(Create Read Update Delete) XML解析的两种常见方式: DOM(D ...

  5. luogu P2553 [AHOI2001]多项式乘法

    传送门 这题就是普及暴力模拟板子FFT板子,只要把多项式读入进来FFT一下就好了(不会的右转P3803) 重点是读入,我本以为这个字符串里到处都有空格,这里提供一种简单思路: 因为里面可能有空格,所以 ...

  6. mysql连接报java.math.BigInteger cannot be cast to java.lang.Long异常

    使用hibernate出现以下错误 java.sql.SQLException: java.lang.ClassCastException: java.math.BigInteger cannot b ...

  7. zabbix系列 ~ 报警模式

    一 简介:聊聊zabbix的报警方式二 报警方式 邮件,短信,钉钉,微信三 准备    需要预选准备好对应报警方式的脚本四 web端设置  1 设置报警方式 2 设置报警触发器    1 选择报警信息 ...

  8. Spring重温(二)--Spring JavaConfig

    1.从Spring 3起,JavaConfig功能已经包含在Spring核心模块,它允许开发者将bean定义和在Spring配置XML文件到Java类中.但是,仍然允许使用经典的XML方式来定义bea ...

  9. shell编程 之 输入输出重定向

    1 输入输出重定向 标准输入:从终端得到命令,对于计算机来说,是从终端获得了命令,执行完了以后,结果和执行状态或者错误提示又会发回终端,这叫标准输出. 输入输出重定向就是从终端以外的别的地方得到输入, ...

  10. 论文笔记:Joint Embeddings of Shapes and Images via CNN Image Purification

    今天分享的这篇论文是 SIGGRAPH 2015 的入选论文,标题比较长,但它做的事情其实很简单:通过一张图片,找到和这张图片最相似的 3D 形状