问题描述
问题我嵌入在代码里.. create produce...... declare i integer; type myref is ref cursor; my myref; s varchar2(40); rec varchar2(20);begin s := 'select stkcode from tr_gfk '; open my for s; LOOP FETCH v_cursor INTO rec; EXIT WHEN v_cursor%NOTFOUND; ....... //问题在这里.这个rec 是返回的tr_gfk 表的stkcode字段 . 1.那么我现在select * from tr_gfk .如何能返回表中所有的数据?定义一个什么样的类型?.怎么写. 2.还有我现在的sql是动态sql.表名(tr_gfk)也许是传过来的参数.就是说要根据传过来的表名参数来定义这个 rec .怎么做? close my; end;
解决方案
改下:DECLARE TYPE myref IS REF CURSOR; cur myref; s VARCHAR2(40); tb_name VARCHAR2(20); col_name VARCHAR2(20); TYPE arrays IS TABLE OF VARCHAR2(20) INDEX BY BINARY_INTEGER; rec arrays;BEGIN col_name := 'id'; -- 传递的列名 tb_name := 'T'; -- 传递的表名 s := 'select ' || col_name || ' stkcode from ' || tb_name; OPEN cur FOR s; FETCH cur BULK COLLECT INTO rec; FOR i IN rec.FIRST .. rec.LAST LOOP NULL; dbms_output.put_line(rec(i)); END LOOP; CLOSE cur;END;
解决方案二:
可以使用集合类型。下面代码你参考下:DECLARE TYPE myref IS REF CURSOR; cur myref; s VARCHAR2(40); tb_name VARCHAR2(20); col_name VARCHAR2(20); TYPE arrays IS TABLE OF VARCHAR2(20) INDEX BY BINARY_INTEGER; rec arrays;BEGIN -- 传递的列名 col_name := 'id'; -- 传递的表名 tb_name := 'T'; s := 'select ' || col_name || ' stkcode from T'; OPEN cur FOR s; FETCH cur BULK COLLECT INTO rec; FOR i IN rec.FIRST .. rec.LAST LOOP NULL; dbms_output.put_line(rec(i)); END LOOP; CLOSE cur;END;