使用sys_refcursor执行pl sql存储过程时出错

时间:2015-01-28 14:02:44

标签: oracle plsql toad

当我尝试执行以下查询时:

 declare
 v_rc    sys_refcursor;
wfrt_a1 varchar2(800 byte);
             wfrt_a2 varchar2(800 byte);
             wfrt_a3 varchar2(800 byte);
             wfrt_a4 varchar2(800 byte);
             wfrt_a5 varchar2(800 byte);

             wfrt_a6 varchar2(800 byte);
              wfrt_a7 varchar2(800 byte);
             wfrt_a8 varchar2(800 byte);
             wfrt_a9 varchar2(800 byte);
             wfrt_a10 varchar2(800 byte);

             wfrt_a11 varchar2(800 byte);
             wfrt_a12 varchar2(800 byte);
             wfrt_a13 varchar2(800 byte);
             wfrt_a14 varchar2(800 byte);

             wfrt_a15 varchar2(800 byte);
             wfrt_a16 varchar2(800 byte);
             wfrt_a17 varchar2(800 byte);
             wfrt_a18 varchar2(800 byte);
             wfrt_a19 varchar2(800 byte);

             wfrt_a20 varchar2(800 byte);
             wfrt_a21 varchar2(800 byte);
             wfrt_a22 varchar2(800 byte);
             wfrt_a23 varchar2(800 byte);
             wfrt_a24 varchar2(800 byte);

             wfrt_a25 varchar2(800 byte);
             wfrt_a26 varchar2(800 byte);
             wfrt_a27 varchar2(800 byte);
             wfrt_a28 varchar2(800 byte);
             wfrt_a29 varchar2(800 byte);

             wfrt_a30 varchar2(800 byte);
             wfrt_a31 varchar2(800 byte);
              wfrt_a32 varchar2(800 byte);
               wfrt_a33 varchar2(800 byte);
                wfrt_a34 varchar2(800 byte);
             wfrt_a35 varchar2(800 byte);
             wfrt_a36 varchar2(800 byte);

                              wfrt_a37 varchar2(800 byte);
             wfrt_a38 varchar2(800 byte);
             wfrt_a39 varchar2(800 byte);
             wfrt_a40 varchar2(800 byte);
             wfrt_a41 varchar2(800 byte);
             wfrt_a42 varchar2(800 byte);
               begin
 execute My_Procedure_Name (:v_rc  ,'Investments Series','31-12-2012','Dealer  Group','All Adv');  -- This returns an open cursor
loop
 fetch v_rc into wfrt_a1, wfrt_a2, wfrt_a3, wfrt_a4,wfrt_a5,wfrt_a6,wfrt_a7,wfrt_a8,wfrt_a9,wfrt_a10,wfrt_a11,wfrt_a12,wfrt_a13,wfrt_a14,wfrt_a15,wfrt_a16,wfrt_a17
 ,wfrt_a18,wfrt_a19,wfrt_a20,wfrt_a21,wfrt_a22,wfrt_a23,wfrt_a24,wfrt_a25,wfrt_a26,wfrt_a27,wfrt_a28,wfrt_a29,wfrt_a30,wfrt_a31,wfrt_a32,wfrt_a33,wfrt_a34,wfrt_a35
 ,wfrt_a36,wfrt_a37,wfrt_a38,wfrt_a39,wfrt_a40,wfrt_a41,wfrt_a42;
 exit when v_rc%NOTFOUND;  -- Exit the loop when we've run out of data
 dbms_output.put_line('Row: '||v_rc%ROWCOUNT||' # '||wfrt_a1||','||wfrt_a2||','||wfrt_a3||','||wfrt_a4||','||wfrt_a5||','||wfrt_a6||','||wfrt_a7||','||wfrt_a8||','||wfrt_a9 
 ||','||wfrt_a10||','||wfrt_a11||','||wfrt_a12||','||wfrt_a13||','||wfrt_a14||','||wfrt_a15||','||wfrt_a16||','||wfrt_a17
 ||','||wfrt_a18||','||wfrt_a19||','||wfrt_a20||','||wfrt_a21||','||wfrt_a22||','||wfrt_a23||','||wfrt_a24||','||wfrt_a25
 ||','||wfrt_a26||','||wfrt_a27||','||wfrt_a28||','||wfrt_a29||','||wfrt_a30||','||wfrt_a31||','||wfrt_a32||','||wfrt_a33
 ||','||wfrt_a34||','||wfrt_a35||','||wfrt_a36||','||wfrt_a37||','||wfrt_a38||','||wfrt_a39||','||wfrt_a40||','||wfrt_a41||','||wfrt_a42);
end loop;
  close v_rc;
 end;

我收到以下错误:  ORA-06550:第56行,第9栏:     PLS-00103:遇到符号     期待下列之一时,“My_Procedure_Name”     :=(@%;即时

注意:我的程序如下

CREATE OR REPLACE PROCEDURE USER.My_Procedure_Name (c1                IN OUT SYS_REFCURSOR,
                                           code IN     VARCHAR2,
                                           date  IN     VARCHAR2,
                                           group     IN     VARCHAR2,
                                          adv        IN     VARCHAR2
                                          )

请问,我做错了?感谢。

1 个答案:

答案 0 :(得分:1)

您没有在PL / SQL中明确execute过程调用,因此请删除该字:

begin
    My_Procedure_Name (v_rc  , 'Investments Series','31-12-2012',
        'All Dealer Group','All Adviser');  -- This returns an open cursor
    loop

在PL / SQL中,你有动态SQL的execute immediate;错误消息是因为它在看到单词immediate时会看到您的过程名称。您可能会将它与SQL * Plus和SQL Developer execute命令混淆,后者是一个小型匿名块的简写。

当你真正想要本地声明的:v_rc时,你传递v_rc作为第一个参数,它表示一个绑定变量。如果它没有对此进行评论,那么你可能已经将其定义为客户端变量,如果你从中获得了“错误的数字或类型”错误,则可以使用不同的类型。

传递字符串而不是日期似乎有点奇怪。