如何使用Oracle存储过程批量插入多行数据至test_1表并解决报错
解决Oracle存储过程插入数据的语法错误问题
看起来你用的是Oracle数据库(从PLS-00103这个Oracle专属错误码可以判断),但你写的存储过程是MySQL风格的语法,这就是报错的核心原因。我帮你把问题拆解并修正:
错误原因分析
你遇到的PLS-00103错误主要来自这几个语法不兼容点:
- 参数声明顺序错误:Oracle PL/SQL中,
IN关键字要放在参数类型的前面,而不是参数名之后 - 数据类型写法错误:Oracle里没有
int(2)这种带长度的整数写法,直接用INT或NUMBER即可;字符串类型推荐用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




