尝试在 Oracle PL SQL 中创建 SELECT 存储过程并在 VARIABLE CURSOR_OUTPUT REFCURSOR 中出现错误;

Trying to create SELECT Stored Procedure in Oracle PL SQL and getting error in VARIABLE CURSOR_OUTPUT REFCURSOR;

我已经创建了用于简单 select 语句输出的过程。

CREATE OR REPLACE PROCEDURE marcydashboard (p_recordset IN OUT SYS_REFCURSOR)
IS
BEGIN
OPEN p_recordset FOR select employee_id,first_name,last_name from employees;
END;

VARIABLE CURSOR_OUTPUT REFCURSOR;
EXECUTE marcydashboard(:CURSOR_OUTPUT);

我需要与 select 语句结果相同的结果,但出现如下错误:

ERROR at line 6: PLS-00103: Encountered the symbol "VARIABLE" 
4. END;
5. VARIABLE CURSOR_OUTPUT REFCURSOR;
6. EXECUTE marcydashboard(:CURSOR_OUTPUT );

请帮我修正错误

嗯,它适用于 SQL*Plus:

SQL> CREATE OR REPLACE PROCEDURE marcydashboard (p_recordset OUT SYS_REFCURSOR)
  2  IS
  3  BEGIN
  4     OPEN p_recordset FOR
  5        SELECT employee_id, first_name, last_name FROM employees;
  6  END;
  7  /

Procedure created.

SQL>
SQL> VARIABLE cursor_output REFCURSOR;
SQL> EXECUTE marcydashboard(:cursor_output);

PL/SQL procedure successfully completed.

SQL> PRINT :cursor_output

EMPLOYEE_ID FIRST_NAME LAST_NAME
----------- ---------- ---------
       7369 SMITH      CLERK
       7499 ALLEN      SALESMAN
       7521 WARD       SALESMAN
       7566 JONES      MANAGER

SQL>

看来您使用的不是那个工具,而是其他工具。在这种情况下,它将不起作用,您必须以不同的方式进行操作,例如

SQL> SET SERVEROUTPUT ON
SQL>
SQL> DECLARE
  2     l_rc           SYS_REFCURSOR;
  3     --
  4     l_employee_id  employees.employee_id%TYPE;
  5     l_first_name   employees.first_name%TYPE;
  6     l_last_name    employees.last_name%TYPE;
  7  BEGIN
  8     marcydashboard (l_rc);
  9
 10     LOOP
 11        FETCH l_rc INTO l_employee_id, l_first_name, l_last_name;
 12
 13        EXIT WHEN l_rc%NOTFOUND;
 14
 15        DBMS_OUTPUT.put_line (
 16           l_employee_id || ' - ' || l_first_name || ' - ' || l_last_name);
 17     END LOOP;
 18
 19     CLOSE l_rc;
 20  END;
 21  /
7369 - SMITH - CLERK
7499 - ALLEN - SALESMAN
7521 - WARD - SALESMAN
7566 - JONES - MANAGER

PL/SQL procedure successfully completed.

SQL>

您需要在 END;

之后换行 /
END;
/

VARIABLE CURSOR_OUTPUT REFCURSOR;