You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用Oracle存储过程批量插入多行数据至test_1表并解决报错

解决Oracle存储过程插入数据的语法错误问题

看起来你用的是Oracle数据库(从PLS-00103这个Oracle专属错误码可以判断),但你写的存储过程是MySQL风格的语法,这就是报错的核心原因。我帮你把问题拆解并修正:

错误原因分析

你遇到的PLS-00103错误主要来自这几个语法不兼容点:

  • 参数声明顺序错误:Oracle PL/SQL中,IN关键字要放在参数类型的前面,而不是参数名之后
  • 数据类型写法错误:Oracle里没有int(2)这种带长度的整数写法,直接用INTNUMBER即可;字符串类型推荐用VARCHAR2(20)(而非varchar(20),Oracle标准写法)
  • 缺少存储过程结构关键字:PL/SQL存储过程需要用IS(或AS)来开启主体逻辑,并且必须用语句分隔符和执行结束符

修正后的单条插入存储过程

这个版本可以单次插入一条数据,和你最初的需求匹配:

CREATE OR REPLACE PROCEDURE insert_test_1(
    a_val IN INT NOT NULL,
    b_val IN VARCHAR2(20),
    c_val IN INT
)
IS
BEGIN
    INSERT INTO test_1 (id, f_name, age)
    VALUES (a_val, b_val, c_val);
    COMMIT; -- 按需添加自动提交,若不需要可以删除,由外部控制事务
END;
/

关键说明:

  • CREATE OR REPLACE:避免重复创建存储过程时抛出"已存在"的错误
  • IS:用来标记存储过程主体逻辑的开始(和AS等效)
  • 最后一行的/:是Oracle SQL工具(比如SQL*Plus)的执行结束符,用来告诉数据库这是完整的存储过程定义

调用方式

你可以通过CALL语句多次调用,插入目标数据:

CALL insert_test_1(1,'josh',23);
CALL insert_test_1(2,'jack',34);
CALL insert_test_1(3,'liam',45);

或者用PL/SQL块一次性完成调用(更简洁):

BEGIN
    insert_test_1(1,'josh',23);
    insert_test_1(2,'jack',34);
    insert_test_1(3,'liam',45);
    COMMIT;
END;
/

更高效的批量插入版本

如果只是要插入指定的三条数据,其实可以写一个无需参数的批量插入存储过程,减少调用次数:

CREATE OR REPLACE PROCEDURE batch_insert_test_1
IS
BEGIN
    INSERT INTO test_1 (id, f_name, age)
    VALUES 
        (1,'josh',23),
        (2,'jack',34),
        (3,'liam',45);
    COMMIT;
END;
/

调用时直接执行:

CALL batch_insert_test_1();

内容的提问来源于stack exchange,提问作者Fahad Taher

火山引擎 最新活动