用包:
包头中声明:
TYPE REF_CURSOR IS REF CURSOR;FUNCTION TEST(v_cur REF_CURSOR) return integer;包体中实现:
FUNCTION TEST(v_cur REF_CURSOR) return integer
IS
....
包头中声明:
TYPE REF_CURSOR IS REF CURSOR;FUNCTION TEST(v_cur REF_CURSOR) return integer;包体中实现:
FUNCTION TEST(v_cur REF_CURSOR) return integer
IS
....
CREATE OR REPLACE PACKAGE "SCOTT"."HWTYPE" as
TYPE HWCURSOR IS REF CURSOR;
end;
2、
CREATE OR REPLACE PROCEDURE "SCOTT"."PROC_TEST_CURSOR" (DDD OUT
HWTYPE.HWCURSOR)
as
var_DEPTNO DEPT.DEPTNO%TYPE;
var_DNAME DEPT.DNAME%TYPE;
var_LOC DEPT.LOC%TYPE;
begin
--这样可以动态设置游标了。
AA:='SELECT DEPTNO,DNAME,LOC FROM DEPT';
open DDD for aa;
--用起来和一般游标一样。
FETCH DDD INTO var_DEPTNO,var_DNAME,var_LOC;
WHILE DDD%FOUND LOOP
DBMS_OUTPUT.PUT_LINE(var_DEPTNO);
DBMS_OUTPUT.PUT_LINE(var_DNAME);
DBMS_OUTPUT.PUT_LINE(var_LOC);
FETCH DDD INTO var_DEPTNO,var_DNAME,var_LOC;
END LOOP;
CLOSE DDD;
EXCEPTION
WHEN OTHERS THEN
IF DDD%ISOPEN THEN
CLOSE DDD;
END IF;
end;
3、sqlplus中进行测试:set serverout on
var aa REFCURSOR
exec scott.PROC_TEST_CURSOR(:aa);
print :aa;这么用就行了!
--这样可以动态设置游标了。
AA:='SELECT DEPTNO,DNAME,LOC FROM DEPT';
open DDD for aa;
这句就是可以让你自己来拼你要的游标语句!另外你只要知道表名就可以知道表中的各个字段信息:
select COLUMN_NAME,DATA_TYPE from cols where TABLE_NAME='你的大写表名';不知道是不是你想要的效果!
( select_sql in varchar2, --传入要查询的字段名组
from_sql in varchar2, --传入要查询的表名
where_sql in varchar2, --传入要查询的条件
DDD OUT HWTYPE.HWCURSOR)as
sql_string varchar2(5000);
beginsql_string:= 'select ' || select_sql ||
' from ' || from_sql ||
' where ' || where_sql ;open DDD for sql_string;end;没测试过!你看行不?