Node.js 如何在oracledb中使用column.nextval
我的表中有一列ID,该ID通常由.nextval填充。.nextval作为一个普通的sql语句非常有效,例如Node.js 如何在oracledb中使用column.nextval,node.js,oracle,node-oracledb,Node.js,Oracle,Node Oracledb,我的表中有一列ID,该ID通常由.nextval填充。.nextval作为一个普通的sql语句非常有效,例如插入MYTABLE(COLA,COLB,COLC)值(COLA_SEQ.nextval,'ABCD','25-JUL-2019')其中COLA是一个数字,COLB是一个varchar,而COLC是一个日期字段。在节点中,我尝试按如下方式插入数据库: const oracledb = require('oracledb'); const async = require('async');
插入MYTABLE(COLA,COLB,COLC)值(COLA_SEQ.nextval,'ABCD','25-JUL-2019')
其中COLA是一个数字,COLB是一个varchar
,而COLC
是一个日期字段。在节点中,我尝试按如下方式插入数据库:
const oracledb = require('oracledb');
const async = require('async');
// Database connect function
const doconnect = function (cb) {
oracledb.getConnection(database, cb);
};
// Database disconnect function
const dorelease = function (conn) {
conn.close(function (err) {
if (err)
console.error(err.message);
});
};
// Database insert function
const doinsert = function (conn, cb) {
let table = "MYTABLE";
let inserts = [{
COLA: 'COLA_SEQ.nextval',
COLB: 'ABCD',
COLC: '25-JUL-2019'
}];
// Extract object keys from inserts and format them for Oracle
// Oracle format needed => (COLUMN_A, COLUMN_A, COLUMN_C)
let keys = Object.keys(inserts[0]);
keys = '(' + keys.join(', ') + ')';
// Extract object keys from inserts as value placeholders and format them for Oracle
// Oracle format needed => (:COLUMN_A, :COLUMN_A, :COLUMN_C)
let vals = Object.keys(inserts[0]);
vals.forEach(function (element, idx) {
vals[idx] = ':' + element;
});
vals = '(' + vals.join(', ') + ')';
// Build sql insert statement
// Oracle format needed => "INSERT INTO TABLE_A (COLUMN_A, COLUMN_A, COLUMN_C) VALUES (:COLUMN_A, :COLUMN_A, :COLUMN_C)"
var sql = "INSERT INTO " + table + " " + keys + " VALUES " + vals;
var options = {
autoCommit: false,
batchErrors: true
};
// Insert all data into Oracle database
conn.executeMany(sql, inserts, options, function (err, result) {
if (err)
return cb(err, conn);
else {
// Commit all changes made
conn.commit();
return cb(null, conn);
}
});
};
// Async waterfall for sequential code exection (connect > query > disconnect)
async.waterfall(
[
doconnect,
doinsert
],
function (err, conn) {
if (err) {
console.error("In waterfall error cb: ==>", err, "<==");
response.status = String(err);
}
if (conn)
dorelease(conn);
});
const oracledb=require('oracledb');
const async=require('async');
//数据库连接功能
const doconnect=函数(cb){
getConnection(数据库,cb);
};
//数据库断开功能
常数dorelease=函数(conn){
连接关闭(功能(错误){
如果(错误)
控制台错误(错误消息);
});
};
//数据库插入函数
const doinsert=函数(conn,cb){
let table=“MYTABLE”;
设插入=[{
可乐:“可乐下一代”,
COLB:“ABCD”,
COLC:'2019年7月25日'
}];
//从插入内容中提取对象键并为Oracle设置其格式
//需要Oracle格式=>(列A、列A、列C)
设keys=Object.keys(插入[0]);
keys='('+keys.join(',')+');
//从插入中提取对象键作为值占位符,并为Oracle设置其格式
//需要Oracle格式=>(:列A,:列A,:列C)
设vals=Object.keys(插入[0]);
vals.forEach(函数(元素,idx){
VAL[idx]=':'+元素;
});
VAL='('+VAL.join(',')+')';
//生成sql插入语句
//所需Oracle格式=>“插入表A(列A、列A、列C)值(:列A、:列A、:列C)”
var sql=“插入“+表+”+键+“值”+VAL;
变量选项={
自动提交:错误,
批处理错误:true
};
//将所有数据插入Oracle数据库
conn.executeMany(sql、插入、选项、函数(错误、结果){
如果(错误)
返回cb(错误,连接);
否则{
//提交所做的所有更改
conn.commit();
返回cb(空,连接);
}
});
};
//用于顺序代码执行的异步瀑布(连接>查询>断开连接)
异步瀑布(
[
doconnect,
多因塞特
],
功能(err,conn){
如果(错误){
console.error(“瀑布式错误cb:==>”,err,”您的代码将生成一个查询:
插入表A(列A、列B、列C)值(:列A、:列B、:列C)
然后将尝试将值'COLA_SEQ.nextval'
分配给第一个绑定变量。该值是一个字符串,不是一个数字(这是该列预期的数据类型),也不是使用序列的请求
如果要使用序列,则需要生成以下查询:
插入表A(列A、列B、列C)中的值(COLA\u SEQ.nextval,:列B,:列C)
它不使用bind变量,但在语句中有序列。通常创建一个触发器来处理调用序列。nextval
。这样,您就不必为主键列插入任何内容-它仍然是必需的,但触发器将处理它。我更愿意为此使用触发器,但我得到了从管理我的服务器的DBA返回。为了将来的参考,Oracle DB 12.1引入了标识列,以消除在这种情况下对序列和触发器的需要。例如,创建表行程(默认情况下以NULL作为标识生成的id号(11)(从1开始))
我忘了提到我之前尝试过这个。Oracle返回“错误:ORA-01036:非法变量名/编号”“。您在使用方法时是否遇到过此问题?@user32521即使现在只有两个绑定变量,您是否仍在尝试将3个绑定变量传递到存储过程中?我忘了删除每个对象的COLA。我将此标记为答案。在响应中,我得到{lastRowid:'aaadafaaad3ai',rowsAffected:1}”但是,顺序是整数。有人能解释一下吗?@Ahmednuman您的评论中没有足够的上下文来回答,因为您的查询似乎与此答案无关,因为INSERT
语句不会产生这样的回答。我建议您提出一个新问题,并包含完整的细节表、示例数据、查询、实际响应/错误/问题和预期输出的列表。