Node.js 如何在oracledb中使用column.nextval

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');

我的表中有一列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');

// 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
语句不会产生这样的回答。我建议您提出一个新问题,并包含完整的细节表、示例数据、查询、实际响应/错误/问题和预期输出的列表。