mysql long varchar2_Oracle数据库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中的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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值