You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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客户端)

  1. 先单独执行存储过程创建语句,末尾加/作为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;
/
  1. 存储过程编译成功后,再单独运行后续的客户端命令获取结果,输出格式和直接执行SELECT语句完全一致:
-- 声明游标绑定变量
VARIABLE CURSOR_OUTPUT REFCURSOR;
-- 调用存储过程
EXECUTE marcydashboard(:CURSOR_OUTPUT);
-- 打印游标结果
PRINT CURSOR_OUTPUT;

方案2:PL/SQL匿名块测试(适用于不支持客户端特殊命令的场景)

如果你的运行环境不支持VARIABLE、PRINT等客户端命令,可以用标准PL/SQL匿名块处理输出:

  1. 先开启服务器输出开关:
SET SERVEROUTPUT ON;
  1. 执行匿名块获取结果:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 21:15:00