从Node-OracleDB调用PL/SQL无记录时返回值及循环终止条件咨询
持续调用PL/SQL函数直至无剩余记录的相关问题解答
问题背景
现有如下Node.js调用Oracle PL/SQL函数的代码,需要持续调用该过程直到无剩余记录,需明确两个问题:无剩余记录时result.outBinds的响应是什么?循环应添加何种终止条件?
const result = await connection.execute( `BEGIN :ret := no_func(:p1, :p2, :p3); END;`, { p1: 'Chris', p2: 'Jones', p3: { dir: oracledb.BIND_OUT, type: oracledb.NUMBER }, ret: { dir: oracledb.BIND_OUT, type: oracledb.STRING, maxSize: 40 } }); console.log(result.outBinds);
一、无剩余记录时result.outBinds的响应
result.outBinds的具体内容完全由你调用的no_func PL/SQL函数的逻辑决定,没有通用的标准响应:
- 如果函数设计为无剩余记录时,
ret返回空字符串、'NO_MORE'这类约定标记,或者p3返回0/NULL,那result.outBinds里就会包含这些对应值。 - 核心原则:你需要先明确
no_func在无数据场景下的输出规则,才能知道result.outBinds的具体响应。
二、循环的终止条件
终止条件必须和no_func的输出规则匹配,常见的几种实现方式:
基于字符串输出参数判断
如果ret参数在无剩余记录时返回约定的结束标记(比如空字符串、'NO_DATA'),可以直接检查该值:async function loopUntilNoRecords(connection) { let keepCalling = true; while (keepCalling) { const result = await connection.execute( `BEGIN :ret := no_func(:p1, :p2, :p3); END;`, { p1: 'Chris', p2: 'Jones', p3: { dir: oracledb.BIND_OUT, type: oracledb.NUMBER }, ret: { dir: oracledb.BIND_OUT, type: oracledb.STRING, maxSize: 40 } }); // 假设ret为空时终止循环 if (!result.outBinds.ret || result.outBinds.ret === 'NO_DATA') { keepCalling = false; } } }基于数值输出参数判断
如果p3参数用于返回剩余记录数,当它返回0时终止循环:// 在循环内添加判断 if (result.outBinds.p3 === 0) { keepCalling = false; }基于异常捕获判断
如果no_func在无剩余记录时会抛出Oracle的NO_DATA_FOUND异常,可以通过捕获该异常终止循环:async function loopUntilNoRecords(connection) { while (true) { try { const result = await connection.execute( `BEGIN :ret := no_func(:p1, :p2, :p3); END;`, { p1: 'Chris', p2: 'Jones', p3: { dir: oracledb.BIND_OUT, type: oracledb.NUMBER }, ret: { dir: oracledb.BIND_OUT, type: oracledb.STRING, maxSize: 40 } }); console.log(result.outBinds); } catch (err) { // 捕获NO_DATA_FOUND异常时终止循环(Oracle错误码1403) if (err.errorNum === 1403) { break; } // 其他异常正常抛出 throw err; } } }
内容的提问来源于stack exchange,提问作者Harshini Lakshmi
相关产品推荐
相关产品推荐

