Oracle执行存储过程遇ORA-00936错误,需添加行序号与名称列
解决ORA-00936错误并实现行序号显示需求
错误原因分析
原存储过程的INSERT语句错误使用VALUES关键字包裹子查询,Oracle中通过SELECT语句批量插入数据时,不需要VALUES子句,直接采用INSERT ... SELECT的语法结构即可,这是触发ORA-00936错误的直接原因。
修正方案(分两种场景)
场景1:仅需查询时显示行序号(不修改原表结构)
原建表语句保持不变:
CREATE TABLE table_prc4 ( name VARCHAR2(20) );
修正后的存储过程:
CREATE OR REPLACE PROCEDURE addnewmembe ( str IN VARCHAR2 ) AS BEGIN -- 移除VALUES关键字,直接使用INSERT...SELECT完成批量插入 INSERT INTO table_prc4 SELECT regexp_substr(str, '[^,]+', 1, level) AS parts FROM dual CONNECT BY regexp_substr(str, '[^,]+', 1, level) IS NOT NULL; COMMIT; END ; /
执行存储过程后,通过以下查询语句获取带行序号的结果:
SELECT ROWNUM AS 行序号, name FROM table_prc4;
场景2:将行序号存入表中(修改表结构)
先修改建表语句,添加序号字段:
CREATE TABLE table_prc4 ( id NUMBER, -- 行序号字段 name VARCHAR2(20) );
修正后的存储过程(插入时同时存入行序号):
CREATE OR REPLACE PROCEDURE addnewmembe ( str IN VARCHAR2 ) AS BEGIN INSERT INTO table_prc4 (id, name) -- 使用LEVEL生成行序号,结合REGEXP_COUNT优化循环效率 SELECT level AS 行序号, regexp_substr(str, '[^,]+', 1, level) AS parts FROM dual CONNECT BY LEVEL <= REGEXP_COUNT(str, '[^,]+'); COMMIT; END ; /
执行存储过程后,直接查询表即可看到行序号和名称:
SELECT id AS 行序号, name FROM table_prc4;
执行示例
调用存储过程的代码保持不变:
BEGIN addnewmembe('saeed,amir,hossein'); END; /
内容的提问来源于stack exchange,提问作者Its_faezeh0308
相关产品推荐
相关产品推荐

