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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 10:24:54