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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 05:35:12