我正在使用PL / SQL Developer,我编写了一个程序来运行报告,我需要过程来输出结果集。
该过程接受输入参数,需要输出结果集。
我无法使用视图,因为该过程调用了几个接受我传入过程的参数的API。
我从很多搜索中了解到可以使用ref_cursor,但我无法工作。
该程序的简化版本是:
CREATE OR REPLACE PROCEDURE IFSINFO.SHORTAGE_SHEET (vSite IN VARCHAR2,
vBuyer IN VARCHAR2,
vSupplier IN VARCHAR2,
vCursor OUT SYS_REFCURSOR)
AS
BEGIN
OPEN vCursor FOR
SELECT blah blah blah blah blah blah;
END;
我尝试使用以下方法来演示过程并显示结果集:
BEGIN
vsite := 'S03';
vbuyer := 'AW';
vsupplier := '%';
vcursor refcursor;
IFSINFO.SHORTAGE_SHEET(vsite => :vsite,
vbuyer => :vbuyer,
vsupplier => :vsupplier,
vcursor => :vcursor);
print vcursor;
END;
还有:
variable rc refcursor;
exec IFSINFO.SHORTAGE_SHEET('S03','AW','TQ1',:rc2);
print rc2
但是都不行。请有人建议我在我的智慧结束。
谢谢 罗布
答案 0 :(得分:2)
执行此过程或在SQLPLUS中运行时是否出现错误? 你可以按原样发布你的sqlplus会话吗?
PRINT是一个特定于sqlplus的命令,不能在程序块中调用它。如果您需要在过程中打印refcursor的结果,那么您需要从中获取并以您需要的格式打印每条记录。
SQL> create or replace procedure test_REFCURSOR (
2 i_number in number,
3 o_cursor out sys_refcursor)
4 as
5 begin
6 open o_cursor for
7 'select empno, ename from emp
8 where rownum < ' || i_number ;
9 end;
10 /
Procedure created.
SQL> variable rc refcursor;
SQL> exec test_refcursor(5, :rc);
PL/SQL procedure successfully completed.
SQL> print rc;
EMPNO ENAME
---------- ----------
7369 SMITH
7499 ALLEN
7521 WARD
7566 JONES
您还应该将过程调用(或)过程调用更改为具有不同的变量名.generallt,我将所有输入变量前缀为“i_”,所有输出变量前缀为“o_”。这样,你的程序声明就像......
CREATE OR REPLACE PROCEDURE IFSINFO.SHORTAGE_SHEET (i_Site IN VARCHAR2,
i_Buyer IN VARCHAR2,
i_Supplier IN VARCHAR2,
o_Cursor OUT SYS_REFCURSOR) AS ....
并且程序调用将是..
IFSINFO.SHORTAGE_SHEET( i_site => vsite,
i_buyer => vbuyer,
i_supplier => vsupplier,
o_cursor => vcursor);
您不需要在这些变量的开头使用“:”,因为它们不是主机环境变量(这是使用SQLPLUS进行第二次执行的情况,在过程调用中使用sqlplus变量“rc”) / p>
答案 1 :(得分:1)
在pl / sql developer的底部,代码如下。
创建一个对象来存储结果集
CREATE OR REPLACE TYPE ABC.TEST_TYPE
AS OBJECT
(
"Site" VARCHAR2(25),
);
创建一个类型作为他上面的对象
的表CREATE OR REPLACE TYPE ABC.TEST_COL
AS TABLE OF ABC.TEST_TYPE
创建一个包来执行SQL
CREATE OR REPLACE PACKAGE ABC.TEST_RPT AS
FUNCTION get_report(vPart VARCHAR2,
vBuyer VARCHAR2,
vSupplier VARCHAR2) RETURN ABC.TEST_COL
PIPELINED;
END;
创建包体以执行SQL
CREATE OR REPLACE PACKAGE BODY ABC.TEST_RPT AS
FUNCTION get_report(vPart VARCHAR2,
vBuyer VARCHAR2,
vSupplier VARCHAR2) RETURN ABC.TEST_COL
PIPELINED IS
CURSOR cTest(vPart VARCHAR2,
vBuyer VARCHAR2,
vSupplier VARCHAR2) IS
SELECT Site
FROM table
WHERE Part = vPart
AND Buyer = vBuyer
AND Supplier = vSupplier;
BEGIN
FOR part_rec IN cTest(vSite, vBuyer, vSupplier) LOOP
PIPE ROW(ABC.TEST_TYPE(part_rec.Site));
END LOOP;
RETURN;
CLOSE cTest;
END;
END;
执行和输出结果集的代码
SELECT * FROM TABLE(ABC.TEST_RPT.get_report('','',''))
答案 2 :(得分:0)
我假设您正在使用Sql Plus来执行此操作。首先,定义一个Sql Plus refcursor。
variable vcursor refcursor
接下来,执行匿名pl / sql块。请注意declare
关键字。
DECLARE
vsite := 'S03';
vbuyer := 'AW';
vsupplier := '%';
-- do not declare this, use sql plus bind var vcursor refcursor;
BEGIN
IFSINFO.SHORTAGE_SHEET(vsite => vsite, -- no colon
vbuyer => vbuyer,
vsupplier => vsupplier,
vcursor => :vcursor);
END;
/
然后运行这个sql plus命令。
print vcursor
打印不是pl / sql
答案 3 :(得分:0)
您的引用游标变量为rc
。但是你使用rc2
。
将rc2
更改为rc
,它应该可以正常工作