sqlserver和sybase在存储过程中能直接返回结果集!
但是oracle不能这样写:select * from
你要先定义一个cursor type!
然后用这个cursor来返回!!
1、
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;这么用就行了!
但是oracle不能这样写:select * from
你要先定义一个cursor type!
然后用这个cursor来返回!!
1、
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;这么用就行了!
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货