Oracle中返回结果集的存储过程分享

时间:2022-04-26 21:47:29

Oracle不像SQLServer那样在存储过程中用Select就可以返回结果集,而是通过Out型的参数进行结果集返回的。实际上是利用REF CURSOR 

复制代码代码如下:


--procedure返回记录集: 
----------------------声明一个Package-------------- 
CREATE OR REPLACE PACKAGE pkg_test 
AS 
TYPEmyrctypeIS REF CURSOR; 

PROCEDURE get_r(p_id NUMBER,p_rc OUT myrctype); --Package中声明名为get 的Procedure(只有接口没内容) 
END pkg_test; 

-----------------声明Package Body,即上面Package中的内容,包括Procedure get--------------------- 
CREATE OR REPLACE PACKAGE BODY pkg_test 
AS 
PROCEDURE get_r(p_id NUMBER,p_rc OUT myrctype) 
IS 
sqlstr VARCHAR2 (500); 
BEGIN 
IF p_id = 0 THEN 
OPEN p_rc FOR 
SELECT ID, NAME, sex, address, postcode, birthday 
FROM student; 
ELSE 
sqlstr := 
'select id,name,sex,address,postcode,birthday 
from student where id=:w_id'; --w_id是个参数, 
--以下 p_rc是个REF CURSOR游标类型,而且是OUT型参数,即可返回一个记录集了。USING p_id就是替换上面SQL中:w_id值拉:) 
OPEN p_rc FOR sqlstr USING p_id;  
END IF; 
END get; 
END pkg_test; 

--function返回记录集的例子,原理和上面相同,而是用function的return值来返回记录集。 


函数返回记录集: 
建立带ref cursor定义的包和包体及函数: 

复制代码代码如下:


CREATE OR REPLACE 
package pkg_test as 

type myrctype is ref cursor; 
function get_r(intID number) return myrctype; 
end pkg_test; 

CREATE OR REPLACE 
package body pkg_test as 
--函数体 
function get_r(intID number) return myrctype is 
rc myrctype; --定义ref cursor变量 
sqlstr varchar2(500); 
begin 
if intID=0 then 

--静态测试,直接用select语句直接返回结果 
open rc for select id,name,sex,address,postcode,birthday from student; 
else 
--动态sql赋值,用:w_id来申明该变量从外部获得 
sqlstr := 'select id,name,sex,address,postcode,birthday from student where id=:w_id'; 
--动态测试,用sqlstr字符串返回结果,用using关键词传递参数 
open rc for sqlstr using intid; 
end if; 
return rc; 
end get; 
end pkg_test; 

相关文章