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

创建带IN和OUT参数的存储过程遇编译错误求助

解决带IN/OUT参数的存储过程编译错误(PLS-00103)

嘿,我太懂这种第一次写带IN/OUT参数的存储过程就撞墙的感觉了!你遇到的PLS-00103错误,本质是语法结构出了问题——大概率是你把INSERT语句放错了位置,或者参数、变量的声明环节有疏漏。咱们一步步来解决:

常见错误原因

这个报错最常出现的场景:

  • 把INSERT这类执行语句写在了存储过程的声明块(IS和BEGIN之间)里,而声明块只能放变量、常量、游标等定义,不能放业务执行代码
  • 参数定义语法错误,比如IN/OUT关键字位置不对、参数之间缺少逗号分隔
  • OUT参数没有被正确赋值(比如插入后没把生成的SUBMISSION_ID传递给它)

正确的存储过程示例

假设你的表结构里SUBMISSION_ID是自增主键(比如通过序列自动生成),下面是符合语法要求的完整代码:

CREATE OR REPLACE PROCEDURE insert_submission(
    p_id_tx IN VARCHAR2,        -- 传入的ID_TX,类型根据你的表字段调整
    p_form_name IN VARCHAR2,    -- 传入的FORM_NAME
    p_data_date IN DATE,        -- 传入的DATA_DATE
    o_submission_id OUT NUMBER  -- 要返回的SUBMISSION_ID,类型匹配表字段
)
IS
-- 这里是声明块,只放变量/常量/游标定义(如果不需要可以留空)
BEGIN
    -- 执行插入,同时通过RETURNING子句直接获取生成的SUBMISSION_ID
    INSERT INTO your_target_table  -- 替换成你的实际表名
    (ID_TX, FORM_NAME, DATA_DATE)
    VALUES (p_id_tx, p_form_name, p_data_date)
    RETURNING SUBMISSION_ID INTO o_submission_id;  -- 将生成的主键赋值给OUT参数

    COMMIT;  -- 根据业务需求决定是否提交事务,比如如果是API调用可能由上层控制事务
EXCEPTION
    WHEN OTHERS THEN
        ROLLBACK;  -- 异常时回滚操作
        RAISE;  -- 抛出异常让调用API的地方处理
END insert_submission;
/

关键细节说明

  • 参数命名:我习惯用p_前缀标记IN参数,o_前缀标记OUT参数,这样代码可读性更高,避免和表字段名冲突
  • RETURNING子句:这是获取插入后生成主键最直接的方式,不用单独查序列的CURRVAL,更安全(避免多会话下序列值混乱)
  • 异常处理:加上EXCEPTION块可以捕获错误并回滚,避免脏数据

调用存储过程的示例

如果你想在PL/SQL里测试这个存储过程,可以用下面的代码:

DECLARE
    v_result_submission_id NUMBER;
BEGIN
    insert_submission(
        p_id_tx => 'TX_20240520_001',
        p_form_name => 'UserRegistrationForm',
        p_data_date => SYSDATE,
        o_submission_id => v_result_submission_id
    );
    DBMS_OUTPUT.PUT_LINE('生成的SUBMISSION_ID: ' || v_result_submission_id);
END;
/

你可以对照自己的代码,检查是不是犯了上面提到的错误——比如有没有把INSERT写在IS和BEGIN之间,或者OUT参数有没有正确赋值。

内容的提问来源于stack exchange,提问作者John Wick

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:19:25