举个例子:
declare
cursor tcursor is
with temp_tab as
(select date'2015-7-10' date_col,'TEST TYPE' varchar_col,to_number('158') number_col from dual
union all
select date'2015-7-12' date_col,'TEST TYPE2' varchar_col,to_number('888') number_col from dual)
select * from temp_tab;
type t_cur_type_tab is table of tcursor%rowtype index by binary_integer;
l_cur_type_tab t_cur_type_tab;
l_count number;
begin
l_count := 0;
----------------
--如何动态根据游标的rowtype,获取游标的数据类型以及栏位名称? 因为游标可能是变化的。
--例如,我想知道,根据tcursor%rowtype,得知有3个栏位,栏位名称以及类型是:date_col/date varchar_col/varchar2 number_col/number
----------------
open tcursor;
loop
fetch tcursor bulk collect into l_cur_type_tab limit(3);--直接集合获取多列数据
exit when l_cur_type_tab.count = 0;
dbms_output.put_line('---');
dbms_output.put_line('l_cur_type_tab.count:'||l_cur_type_tab.count);
dbms_output.put_line('l_cur_type_tab.first:'||l_cur_type_tab.first);
dbms_output.put_line('l_cur_type_tab.last:'||l_cur_type_tab.last);
for i in l_cur_type_tab.first .. l_cur_type_tab.last loop
dbms_output.put_line(i||':'||l_cur_type_tab(i).varchar_col || '-' ||l_cur_type_tab(i).number_col);
l_count := l_count + 1;
end loop;
dbms_output.put_line('---');
end loop;
close tcursor;
dbms_output.put_line('Total rows:'||l_count);
end;
----------------------------------------------
自己想到了一个办法解决,应该也是一个比较不错的解决方法。还是得用DBMS_SQL包:
简单来说,就是,用 DBMS_SQL.TO_CURSOR_NUMBER,将本地动态SQL(这里是cursor游标)转换为DBMS_SQL
L_CUR_ID := DBMS_SQL.TO_CURSOR_NUMBER(L_CURSOR);
然后后面的动作,和直接用DBMS_SQL包的处理一模一样。
另外这里有一点要注意的是,游标只要转换为DBMS_SQL之后,游标不再可用。
function to_cursor_number(rc in out sys_refcursor) return integer;
pragma restrict_references(to_cursor_number,RNDS,WNDS);
-- This function takes an OPENed strongly or weakly-typed ref cursor and
-- transforms it into a DBMS_SQL cursor number.
-- Input parameters:
-- rc
-- REF Cursor to be transformed into cursor number.
-- Return value:
-- DBMS_SQL manageable cursor number transformed from a REF CURSOR.
-- Once the REF CURSOR is transformed into a DBMS_SQL cursor number,
-- the REF CURSOR is no longer accessible by any native dynamic SQL
-- operations.
--
----
从一个博客看到的:
转自:http://blog.csdn.net/skyspark/article/details/1711980
从11g开始,NDS和dbms_sql都有了改进。
NDS开始支持大于32KB的动态sql语句,即execute immediate vsql 这里的vsql允许是clob。
而对于DBMS_SQL包:
- 所有NDS支持的数据类型,dbms_sql也开始支持。
- DBMS_SQL.PARSE支持CLOB数据。
- 新加的DBMS_SQL.TO_REFCURSOR函数支持DBMS_SQL到NDS的转换。
- 新加的DBMS_SQL.TO_CURSOR_NUMBER支持从NDS到DBMS_SQL包的转换。
declare
cursor tcursor is
with temp_tab as
(select date'2015-7-10' date_col,'TEST TYPE' varchar_col,to_number('158') number_col from dual
union all
select date'2015-7-12' date_col,'TEST TYPE2' varchar_col,to_number('888') number_col from dual)
select * from temp_tab;
type t_cur_type_tab is table of tcursor%rowtype index by binary_integer;
l_cur_type_tab t_cur_type_tab;
l_count number;
begin
l_count := 0;
----------------
--如何动态根据游标的rowtype,获取游标的数据类型以及栏位名称? 因为游标可能是变化的。
--例如,我想知道,根据tcursor%rowtype,得知有3个栏位,栏位名称以及类型是:date_col/date varchar_col/varchar2 number_col/number
----------------
open tcursor;
loop
fetch tcursor bulk collect into l_cur_type_tab limit(3);--直接集合获取多列数据
exit when l_cur_type_tab.count = 0;
dbms_output.put_line('---');
dbms_output.put_line('l_cur_type_tab.count:'||l_cur_type_tab.count);
dbms_output.put_line('l_cur_type_tab.first:'||l_cur_type_tab.first);
dbms_output.put_line('l_cur_type_tab.last:'||l_cur_type_tab.last);
for i in l_cur_type_tab.first .. l_cur_type_tab.last loop
dbms_output.put_line(i||':'||l_cur_type_tab(i).varchar_col || '-' ||l_cur_type_tab(i).number_col);
l_count := l_count + 1;
end loop;
dbms_output.put_line('---');
end loop;
close tcursor;
dbms_output.put_line('Total rows:'||l_count);
end;
----------------------------------------------
自己想到了一个办法解决,应该也是一个比较不错的解决方法。还是得用DBMS_SQL包:
简单来说,就是,用 DBMS_SQL.TO_CURSOR_NUMBER,将本地动态SQL(这里是cursor游标)转换为DBMS_SQL
L_CUR_ID := DBMS_SQL.TO_CURSOR_NUMBER(L_CURSOR);
然后后面的动作,和直接用DBMS_SQL包的处理一模一样。
另外这里有一点要注意的是,游标只要转换为DBMS_SQL之后,游标不再可用。
function to_cursor_number(rc in out sys_refcursor) return integer;
pragma restrict_references(to_cursor_number,RNDS,WNDS);
-- This function takes an OPENed strongly or weakly-typed ref cursor and
-- transforms it into a DBMS_SQL cursor number.
-- Input parameters:
-- rc
-- REF Cursor to be transformed into cursor number.
-- Return value:
-- DBMS_SQL manageable cursor number transformed from a REF CURSOR.
-- Once the REF CURSOR is transformed into a DBMS_SQL cursor number,
-- the REF CURSOR is no longer accessible by any native dynamic SQL
-- operations.
--
----
从一个博客看到的:
转自:http://blog.csdn.net/skyspark/article/details/1711980
从11g开始,NDS和dbms_sql都有了改进。
NDS开始支持大于32KB的动态sql语句,即execute immediate vsql 这里的vsql允许是clob。
而对于DBMS_SQL包:
- 所有NDS支持的数据类型,dbms_sql也开始支持。
- DBMS_SQL.PARSE支持CLOB数据。
- 新加的DBMS_SQL.TO_REFCURSOR函数支持DBMS_SQL到NDS的转换。
- 新加的DBMS_SQL.TO_CURSOR_NUMBER支持从NDS到DBMS_SQL包的转换。