使用TS+node-oracledb调用Oracle存储过程报ORA-01008错误如何解决
错误原因与修复方案
ORA-01008错误的核心是PL/SQL语句中声明的所有绑定变量没有全部完成绑定,你的代码存在以下问题:
你在PL/SQL块中定义了输出绑定变量:result用来接收存储函数返回的SYS_REFCURSOR,但入参绑定对象中完全没有定义这个变量的绑定规则,这是触发报错的直接原因。同时node-oracledb中绑定REF CURSOR类型需要显式指定类型和输出方向。
修复后的Repository层代码
public async bipagem( p_fil_filial: string, p_set_cdgo: string, p_mini_fab: string, p_codigo_barra: string, userPool: string ) { let conn; try { conn = await connection(userPool); const resultado = await conn.execute( `DECLARE result SYS_REFCURSOR; BEGIN -- Call the function :result := brio.pck_fab0024.bipagem(p_fil_filial => :p_fil_filial, p_set_cdgo => :p_set_cdgo, p_mini_fab => :p_mini_fab, p_codigo_barra => :p_codigo_barra, p_msg => :p_msg); END;`, { p_fil_filial, p_set_cdgo, p_mini_fab, p_codigo_barra, p_msg: { type: oracledb.STRING, dir: oracledb.BIND_OUT }, // 新增result变量的绑定配置 result: { type: oracledb.CURSOR, dir: oracledb.BIND_OUT } } ); // 如需读取游标内数据可参考以下逻辑 const resultCursor = resultado.outBinds.result; const rows = await resultCursor.getRows(100); // 100为单次读取行数,可按需调整 // 处理完数据后关闭游标 await resultCursor.close(); return resultado; } catch (erro) { console.log(erro); } finally { if (conn) conn.close(); } }
内容的提问来源于stack exchange,提问作者Arthur Prasniski
相关产品推荐
相关产品推荐

