因为项目需要,需要写一个存储过程在oracle上,返回的是记录集,普通的存储过程貌似不可以,按照网上说的用游标写了一个出来,如下:
--声明包头
CREATE OR REPLACE PACKAGE PACK_defectsCount AS
TYPE CUR_defectsCount IS REF CURSOR;
PROCEDURE up_defectsCount(startdate in date,
enddate in date,
p_cur out CUR_defectsCount);
END PACK_defectsCount;
--声明包体
CREATE OR REPLACE PACKAGE BODY PACK_defectsCount AS
PROCEDURE up_defectsCount(startdate in date, enddate in date, p_cur out CUR_defectsCount) IS
sqlString varchar2(1000);
BEGIN
sqlString := 'SELECT
'''' abbreviation,
'''' FindCount,
'''' CompleteCount,
'''' OvertimeCount,
'''' CompleteRate,
'''' FindCount1,
'''' CompleteCount1,
'''' OvertimeCount1,
'''' CompleteRate1,
'''' FindCount2,
'''' CompleteCount2,
'''' OvertimeCount2,
'''' CompleteRate2,
'''' FindCount3,
'''' CompleteCount3,
'''' OvertimeCount3,
'''' CompleteRate3
FROM dual
WHERE :startdate = :startdate
AND :enddate = :enddate';
OPEN p_cur FOR sqlString USING startdate,startdate,enddate,enddate;
END up_defectsCount;
END PACK_defectsCount;
然后大概的解释下,在包头文件中定义的cursor就是游标类型,然后是存储过程的输入输出参数,下面就是包体,执行时要包头包体分开执行,下面只是我随意写的一个SQL只是为了有字段而已(是from dual表的,赋的空值),参数那边也是为了试试参数是否传递过来构造的一个类似1=1的效果,open sql的时候因为我这样写的所以参数各被调用二次,实际上应该是一次就可以的,还有就是如果你的SQL短的话可以不定义变量再open,直接放到open 'sql' using param也一样的,其他没什么要说的了,照葫芦画瓢就OK。测试的时候在PLSQL下对应的package bodies,然后右键view你的package然后选到procedure右键test ,填上输入参数,执行后下面的游标那行后面有个[...]的按钮,点开就能看到啦~