node-oracledb是否支持类似MySQL的单次查询执行多条语句功能?
在Node.js的oracledb驱动中,存在和MySQL类似的单次查询执行多条语句的能力,具体实现方式如下:
实现步骤
1. 开启多语句执行配置
和MySQL的配置逻辑一致,创建连接时设置multipleStatements: true参数即可开启多语句执行能力:
const oracledb = require('oracledb'); let connection; // 初始化Oracle连接 async function initOracleConn() { try { connection = await oracledb.getConnection({ user: 'Oracle用户名', password: 'Oracle密码', connectString: 'localhost:1521/ORCL', // 替换为你的Oracle连接地址 multipleStatements: true // 开启单次调用执行多条SQL的能力 }); } catch (err) { console.error('连接初始化失败:', err); } }
2. 执行多条SQL语句
多条SQL之间用分号分隔即可,和你在MySQL中的使用方式一致,结果会按SQL执行顺序存储在返回值的implicitResults数组中:
app.get('/distinct', async (req, res) => { try { const result = await connection.execute(` SELECT DISTINCT country FROM sample_data.olympic_winners ORDER BY country ASC; SELECT DISTINCT sport FROM sample_data.olympic_winners ORDER BY sport ASC `); // result.implicitResults[0] 对应第一条SQL的查询结果,result.implicitResults[1]对应第二条 res.send(result.implicitResults); } catch (err) { console.error('查询失败:', err); res.status(500).send('服务内部错误'); } });
注意事项
- 安全风险提示:和MySQL开启多语句执行的风险一致,该配置会大幅提升SQL注入的风险,绝对不要直接拼接用户输入的内容到SQL语句中,所有外部传参必须使用绑定变量传递。
- 如果不想全局开启多语句执行配置,也可以通过PL/SQL块包裹语句实现相同效果,无需修改连接参数:
const result = await connection.execute(` DECLARE cur1 SYS_REFCURSOR; cur2 SYS_REFCURSOR; BEGIN OPEN cur1 FOR SELECT DISTINCT country FROM sample_data.olympic_winners ORDER BY country ASC; DBMS_SQL.RETURN_RESULT(cur1); OPEN cur2 FOR SELECT DISTINCT sport FROM sample_data.olympic_winners ORDER BY sport ASC; DBMS_SQL.RETURN_RESULT(cur2); END; `); // 结果同样存储在result.implicitResults数组中
内容的提问来源于stack exchange,提问作者faisal-akbar
相关产品推荐
相关产品推荐

