本文标题:long查询结果转换为varchar2类型【本站如从外站转载,会注明出处】
本文链接:http://www.validba.net/2009/02/long%e6%9f%a5%e8%af%a2%e7%bb%93%e6%9e%9c%e8%bd%ac%e6%8d%a2%e4%b8%bavarchar2%e7%b1%bb%e5%9e%8b/
来自Thomas Kyte 《Oracle9i/10g编程艺术》 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_views视图的text字段是个long类型,字符串的操作函数不能直接在该类型上使用,可以用long_help.substr_of函数将该列转换为varchar2然后再使用;
比如long_help.substr_of的调用方法:
select *
from (select owner,
view_name,
long_help.substr_of('select text
from dba_views
where owner =
wner
and view_name = :view_name',1,4000,'owner',owner,'view_name',view_name) substr_of_view_text
from dba_views
where owner = user)
where upper(substr_of_view_text) like '%INNER%';
CopyRight Validba'S Home 版权所有.本站为个人学习之用,评论时请遵守本国法律
如果我的long比4000还长,怎么调用?谢谢!
@Luperci: 循环调用