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

Node.js执行PL/SQL块遇ORA-01036错误,请求排查原因

问题分析与解决:ORA-01036: illegal variable name/number错误

问题场景

你编写的PL/SQL块在Oracle SQL Developer中运行正常,但通过Node.js调用时触发ORA-01036: illegal variable name/number错误。

你的PL/SQL代码

DECLARE
    user_name varchar(255);
    custom_exception EXCEPTION;
    PRAGMA exception_init( custom_exception, -20001);
BEGIN
    SELECT name 
    INTO user_name
    FROM data_table where ID = '1';
    
    IF user_name  = 'temp' THEN 
        RAISE custom_exception;
    END IF;
END;

你的Node.js调用代码

var output = await connection.execute(fs.readFileSync('path_to_pl_sql_file', 'utf8'), {
    message: {
        dir: oracledb.BIND_OUT,
        type: oracledb.STRING,
        maxSize: 100
    }
}, {
    autoCommit: true
});

问题根源

Node.js代码里指定了一个名为message的输出绑定变量,但你的PL/SQL块中完全没有定义这个变量,Oracle数据库找不到对应的绑定项,因此抛出非法变量名/编号的错误。

解决方法

根据你的需求选择以下两种方案之一:

方案1:不需要输出变量,直接移除绑定参数

如果你的PL/SQL块不需要返回任何输出值,直接删除execute方法的第二个参数(绑定变量对象)即可:

var output = await connection.execute(fs.readFileSync('path_to_pl_sql_file', 'utf8'),
    {}, // 空绑定参数对象,也可直接省略该参数
    {
        autoCommit: true
    }
);

方案2:需要输出变量,修改PL/SQL块添加对应绑定项

如果你确实需要返回输出信息(比如异常提示),需要在PL/SQL块中声明对应的OUT绑定变量,并在逻辑中赋值。示例如下:

修改后的PL/SQL块:

DECLARE
    user_name varchar(255);
    custom_exception EXCEPTION;
    PRAGMA exception_init( custom_exception, -20001);
BEGIN
    SELECT name 
    INTO user_name
    FROM data_table where ID = '1';
    
    IF user_name  = 'temp' THEN 
        RAISE custom_exception;
    END IF;
    -- 正常情况赋值输出信息
    :message := '操作成功';
EXCEPTION
    WHEN custom_exception THEN
        -- 异常情况赋值错误信息
        :message := '用户名为temp,触发自定义异常';
    WHEN OTHERS THEN
        :message := '未知错误: ' || SQLERRM;
END;

对应的Node.js调用代码可保持不变,执行后通过output.outBinds.message即可获取输出内容。

内容的提问来源于stack exchange,提问作者DALJIT SINGH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 17:31:14