1

我在带有原型的包中有一个程序:

PROCEDURE simpleSearch(p_keyword IN  VARCHAR2,
                       p_events  OUT SYS_REFCURSOR);

在包正文中,我的定义是:

PROCEDURE simplesearch(p_keyword IN  VARCHAR2,
                       p_events  OUT SYS_REFCURSOR)    
IS
  BEGIN

    OPEN p_events FOR      
      SELECT *
        FROM event e, show s
       WHERE s.eventid = e.id;

  END simplesearch;

当我运行它时,我进入调试屏幕:

DECLARE
  p_keyword VARCHAR2(200);
  p_events  REF cursor;
BEGIN
  p_keyword := 'r';

  package1.SIMPLESEARCH(
     P_KEYWORD => p_keyword,
     P_EVENTS => p_events
  );

  -- DBMS_OUTPUT.PUT_LINE('P_EVENTS = ' || P_EVENTS);

  :P_EVENTS := p_events; -- <-- Cursor

  --rollback; 
END;

它给出了错误 PLS-00201: identifier 'CURSOR' must be declared

为什么光标类型更改为REF CURSOR即使我将其声明为SYS_REFCURSOR

4

2 回答 2

0

为什么要使用 REFCURSOR 来存储 SYS_REFCURSOR 的输出。将您的调用块更改为下面,它应该可以工作:

     DECLARE
       P_KEYWORD VARCHAR2(200);
       P_EVENTS SYS_REFCURSOR ;
     BEGIN
        P_KEYWORD := 'r';

         PACKAGE1.SIMPLESEARCH(
                       P_KEYWORD => P_KEYWORD,
                       P_EVENTS => P_EVENTS
              );
          /* Legacy output: 
             DBMS_OUTPUT.PUT_LINE('P_EVENTS = ' || P_EVENTS);
          */ 
           -- :P_EVENTS := P_EVENTS; --<-- Cursor
             --rollback; 
         END;
于 2015-04-28T02:25:23.777 回答
0

应该是这个

DECLARE
   P_KEYWORD VARCHAR2(200);
   P_EVENTS SYS_REFCURSOR;
BEGIN

或长格式(你必须使用我认为它是在 Oracle 10g 之前):

DECLARE
   P_KEYWORD VARCHAR2(200);
   TYPE P_EVENTS_TYPE IS REF CURSOR;
   P_EVENTS P_EVENTS_TYPE;
BEGIN
于 2015-04-28T07:12:06.050 回答