如何使用Node.js从Oracle查询数据并插入MySQL?代码报错求助
问题:Oracle查询结果传入MySQL插入时报
ReferenceError: results is not defined 报错信息
connection.query("INSERT INTO authdetails (total, authcli, authuser) VALUES ?",[results], function(err, rows) { ^ ReferenceError: results is not defined
你的代码
var config = require('/config.json'); var dbhost = config.host; var service_name = config.service_name; var user = config.user; var password = config.password; const getQueryOracle = async(ip, Service_NAME, user, password, query) => { try { sql = await oracledb.getConnection({ connectString: `${ip}/${Service_NAME}`, user: user, password: password }) results = await sql.execute(query), } catch(err) { console.error(err.message); } finally { if(sql) { try { // Always close connections await sql.close() } catch (err) { console.error(err.message) } } return results: } }; const mysql = require('/mysql'); const connection = mysql.createConnection({ host: 'localhost', port: 3306, user: 'testuser', password: 'testusera123', database: 'DashBoard' }); connection.query("INSERT INTO authdetails (total, authcli, authuser) VALUES ?", [results], function (err, rows) { if (err) { console.log(err); connection.commit(); connection.close(); return; } getQueryOracle(dbhost, service_name, user, password, `myquery` ) })
问题根源及修复方案
1. 执行顺序完全颠倒
你现在是先执行MySQL插入,再调用Oracle查询获取数据——这时候results根本还没被赋值,自然会报未定义错误。必须先从Oracle拿到数据,再执行MySQL插入。
2. 变量作用域与语法错误
getQueryOracle里的sql、results没声明,会变成全局变量,存在风险;return results:是语法错误,冒号要改成分号;results = await sql.execute(query),末尾的逗号要改成分号;- Oracle查询结果需要提取
rows属性(oracledb.execute返回的结果对象里,实际数据在rows字段)。
修正后的完整代码
const config = require('/config.json'); const dbhost = config.host; const service_name = config.service_name; const user = config.user; const password = config.password; const oracledb = require('oracledb'); // 补充引入Oracle驱动模块 const mysql = require('/mysql'); // 封装Oracle查询函数 const getQueryOracle = async (ip, serviceName, dbUser, dbPwd, query) => { let connection; try { connection = await oracledb.getConnection({ connectString: `${ip}/${serviceName}`, user: dbUser, password: dbPwd }); // 提取查询结果的rows数据 const result = await connection.execute(query); return result.rows; } catch (err) { console.error('Oracle查询出错:', err.message); throw err; // 抛出错误让上层处理 } finally { if (connection) { try { await connection.close(); } catch (err) { console.error('关闭Oracle连接出错:', err.message); } } } }; // 封装MySQL插入函数 const insertToMySQL = async (data) => { const connection = mysql.createConnection({ host: 'localhost', port: 3306, user: 'testuser', password: 'testusera123', database: 'DashBoard' }); return new Promise((resolve, reject) => { // MySQL批量插入的格式要求:VALUES ? 对应二维数组 const sql = "INSERT INTO authdetails (total, authcli, authuser) VALUES ?"; connection.query(sql, [data], (err, rows) => { if (err) { console.error('MySQL插入出错:', err); reject(err); } else { console.log('插入成功:', rows.affectedRows); resolve(rows); } // 操作完成后关闭连接 connection.end(); }); }); }; // 主流程:先查Oracle,再插入MySQL const main = async () => { try { // 1. 从Oracle获取数据 const oracleResults = await getQueryOracle(dbhost, service_name, user, password, `myquery`); // 2. 插入到MySQL(确保oracleResults是二维数组,比如[[total, authcli, authuser]]) await insertToMySQL(oracleResults); } catch (err) { console.error('主流程出错:', err.message); } }; // 启动主流程 main();
额外注意点
- 确保
oracledb模块已安装(npm install oracledb),且系统环境符合Oracle客户端运行要求; - Oracle查询的
myquery要返回对应三个字段的数据,顺序需匹配MySQL表的字段顺序; - MySQL的
VALUES ?语法要求传入二维数组,如果Oracle返回单条数据,需格式化为[[val1, val2, val3]]而非[val1, val2, val3]。
内容的提问来源于stack exchange,提问作者user22313758
相关产品推荐
相关产品推荐

