Oracle PL/SQL创建SELECT存储过程REFCURSOR行报PLS-00103错如何解决
问题修复方案
错误原因
该PLS-00103报错的核心原因是你把两类不同语法体系的语句放在同一个PL/SQL执行上下文里运行了:
CREATE OR REPLACE PROCEDURE ... END;属于PL/SQL语法,由Oracle数据库的PL/SQL引擎处理VARIABLE、EXECUTE是SQL*Plus、Oracle SQL Developer等客户端工具特有的命令,不属于PL/SQL语法,直接放在存储过程定义之后会被PL/SQL引擎识别为非法字符。
修复步骤
方案1:分步执行(推荐,适配大多数Oracle客户端)
- 先单独执行存储过程创建语句,末尾加
/作为PL/SQL块结束标识,触发存储过程编译:
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; /
- 存储过程编译成功后,再单独运行后续的客户端命令获取结果,输出格式和直接执行SELECT语句完全一致:
-- 声明游标绑定变量 VARIABLE CURSOR_OUTPUT REFCURSOR; -- 调用存储过程 EXECUTE marcydashboard(:CURSOR_OUTPUT); -- 打印游标结果 PRINT CURSOR_OUTPUT;
方案2:PL/SQL匿名块测试(适用于不支持客户端特殊命令的场景)
如果你的运行环境不支持VARIABLE、PRINT等客户端命令,可以用标准PL/SQL匿名块处理输出:
- 先开启服务器输出开关:
SET SERVEROUTPUT ON;
- 执行匿名块获取结果:
DECLARE v_cursor SYS_REFCURSOR; v_emp_id employees.employee_id%TYPE; v_first_name employees.first_name%TYPE; v_last_name employees.last_name%TYPE; BEGIN -- 调用存储过程 marcydashboard(v_cursor); -- 循环遍历游标输出结果 LOOP FETCH v_cursor INTO v_emp_id, v_first_name, v_last_name; EXIT WHEN v_cursor%NOTFOUND; DBMS_OUTPUT.PUT_LINE(v_emp_id || ' ' || v_first_name || ' ' || v_last_name); END LOOP; -- 关闭游标释放资源 CLOSE v_cursor; END; /
内容的提问来源于stack exchange,提问作者sivaprakash
相关产品推荐
相关产品推荐

