SYS_REFCURSOR自动更改 REF CURSOR,并在 oracle PL/SQL 中给出错误



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

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

为什么要使用 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;

一定是这个

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

最新更新