javascript - Node-oracledb:只有最后一个值在循环中被多次插入
问题描述
我正在读取 XLSX 文件并将记录插入 ORACLE 数据库。XLSX 包含以下值
H
H
H
H
JK
但只有 JK 被插入 5 次。下面是使用的代码
var XLSX = require('xlsx')
var workbook = XLSX.readFile('Accounts.xlsx');
var sheet_name_list = workbook.SheetNames;
var xlData = XLSX.utils.sheet_to_json(workbook.Sheets[sheet_name_list[0]]);
var connection;
var oracledb = require('oracledb');
oracledb.autoCommit = true;
var dbConfig = require(__dirname + '/dbconfig.js');
var cnt;
oracledb.getConnection(
dbConfig,
function(err, connection) {
if (err) throw err;
for (i in xlData)
{
var act_fam = xlData[i].ACCOUNT_FAMILY;
connection.execute(
`SELECT * FROM TFAMCORGDS_TEST WHERE MNEFAMCOR='`+ act_fam + `'`,
function(err, results) {
if (err) throw err;
cnt = results.rows.length;
if (cnt === 0)
{
connection.execute(
`INSERT INTO TFAMCORGDS_TEST (CODFAMCOR,MNEFAMCOR,DATMOD,DATFINACT) VALUES (SCORGDS.NEXTVAL,'`+ act_fam + `',SYSDATE,NULL)`,
function(err, results) {
if (err) throw err;
console.log('Rows Inserted: ', results.rowsAffected);
//do work on the rows here
}
);
}
});
}
}
);
而且我也不能在函数"cnt"
外使用变量值,connection.execute
尽管它是全局变量。
解决方案
我将在不同的函数中分离任务并将它们包装在 Promise 中,而不是在循环中调用回调。代码看起来像这样
var XLSX = require("xlsx");
var workbook = XLSX.readFile("Accounts.xlsx");
var sheet_name_list = workbook.SheetNames;
var xlData = XLSX.utils.sheet_to_json(workbook.Sheets[sheet_name_list[0]]);
var connection;
var oracledb = require("oracledb");
oracledb.autoCommit = true;
var dbConfig = require(__dirname + "/dbconfig.js");
var cnt;
function getConnection() {
return new Promise((resolve, reject) => {
oracledb.getConnection(dbConfig, function(err, connection) {
if (err) {
reject(err);
}
resolve(connection);
});
});
}
function get(connection, act_fam) {
return new Promise((resolve, reject) => {
connection.execute(`SELECT * FROM TFAMCORGDS_TEST WHERE MNEFAMCOR='` + act_fam + `'`, function(err, results) {
if (err) {
reject(err);
}
resolve(results);
});
});
}
function insert(connection, act_fam) {
return new Promise((resolve, reject) => {
connection.execute(
`INSERT INTO TFAMCORGDS_TEST (CODFAMCOR,MNEFAMCOR,DATMOD,DATFINACT) VALUES (SCORGDS.NEXTVAL,'` +
act_fam +
`',SYSDATE,NULL)`, function(err, results) {
if (err) {
reject(err);
}
resolve(results);
});
});
}
async function main() {
const connection = await getConnection();
for (i in xlData)
{
var act_fam = xlData[i].ACCOUNT_FAMILY;
const results = await get(connection, act_fam);
cnt = results.rows.length;
if (cnt === 0) {
const insertResult = await insert(connection, act_fam);
console.log('Rows Inserted: ', insertResult.rowsAffected);
}
}
}
希望这可以帮助
推荐阅读
- php - Raspberry Pi 4 python 代码不能从 php 运行
- php - 异步获取请求
- mysql - Mysql - 有没有办法查询多对多关系并包括不在链接表中的行?
- python - Python:将具有包含值列表的键值对的字典转换为元组列表
- python - 如何从向量的末尾开始一个 for 循环,并在值 0 处执行某些操作
- sql - SQL 新手:仅将名字从全名字段导入到报表生成器(数据源查询)
- tableau-api - 如果 Tableau 中有一行为真,如何为每一行创建一个计算字段?
- firebase - 请求完成后如何继续运行 Firebase Cloud Function
- google-apps-script - 如何在 Google Sheet Apps 脚本中获取字符串值
- javascript - 物化 css | js - 轮播幻灯片中的可视化问题