Javascript 使用用户定义的类型数组作为参数在nodejs中调用DB2存储过程
我正在尝试调用一个存储过程,其中的参数锚定到用户定义的类型数组。我正在使用node-ibm\u db npm模块。我试着按照节点\u modules/ibm\u db/test/test-array-insert.js中的示例进行操作 我根据在ibm_db测试程序中找到的概念,提出了我的示例测试程序Javascript 使用用户定义的类型数组作为参数在nodejs中调用DB2存储过程,javascript,node.js,db2,db2-luw,Javascript,Node.js,Db2,Db2 Luw,我正在尝试调用一个存储过程,其中的参数锚定到用户定义的类型数组。我正在使用node-ibm\u db npm模块。我试着按照节点\u modules/ibm\u db/test/test-array-insert.js中的示例进行操作 我根据在ibm_db测试程序中找到的概念,提出了我的示例测试程序 var common = require("./common") , ibmdb = require("../") , schema = co
var common = require("./common")
, ibmdb = require("../")
, schema = common.connectionObject.CURRENTSCHEMA
, insertCount = 0;
;
ibmdb.debug(true);
ibmdb.open(common.connectionString, function(err, conn) {
if(err) {
console.log(err);
return;
}
conn.querySync("create table arrtab (c1 INTEGER, c2 INTEGER, c3 char(1), c4 varchar(10))");
conn.querySync("CREATE OR REPLACE TYPE SAMPLE_TYPE AS ROW ( C1 INTEGER, C2 INTEGER, C3 char(1), C4 VARCHAR(10))");
conn.querySync("CREATE OR REPLACE TYPE SAMPLE_ARR AS SAMPLE_TYPE ARRAY[100]");
err = conn.querySync("CREATE OR REPLACE PROCEDURE TEST_TYPE ( IN P_ARRAY SAMPLE_ARR) BEGIN INSERT INTO ARRTAB (C1,C2,C3,C4) SELECT C1,C2,C3,C4 FROM UNNEST(P_ARRAY) AS (C1,C2, C3, C4); END")
if(err.length) { console.log(err); return; }
var paramC1 = {ParamType:"ARRAY", DataType:1, Data:[0,1,2]}
var paramC2 = {ParamType:"ARRAY", DataType:1, Data:[19,20,18]}
var paramC3 = {ParamType:"ARRAY", DataType:1, Data:['Y','N','Y']}
var paramC4 = {ParamType:"ARRAY", DataType:"VARCHAR", Data:['BMWX','TESL','TOYO'], Length:4}
var final = {ParamType:"ARRAY", DataType:1, Data: [paramC1,paramC2,paramC3,paramC4]}
conn.querySync("insert into arrtab values (9, 4, 'Y', 'rock')");
if(err.length) { console.log(err); return; }
var data = conn.querySync("select * from arrtab");
console.log("\nSelected data for table ARRTAB =\n", data);
var queryOptions = { sql: "call test_type(?)",
params: [final],
ArraySize:3}
// var queryOptions = {sql: "insert into arrtab values (?,?,?,?)",
// params: [paramC1, paramC2, paramC3, paramC4],
// ArraySize: 3}
err = conn.querySync(queryOptions);
console.log(err)
var data = conn.querySync("select * from arrtab");
console.log("\nSelected data for table ARRTAB =\n", data);
conn.querySync("drop table arrtab");
});
基本上,用例是我将传递一组表数据到存储过程以进行保存。为此,我创建了一个udt行和一个基于udt行的udt数组。ibm_db似乎无法接受复杂的数组参数
C:\Users\r\Documents\Github\test>node node_modules\ibm_db\test\test-array-sp2.js
node-ibm_db logs enabled.
1.11 :: odbc.js:querySync() => create table arrtab (c1 INTEGER, c2 INTEGER, c3 char(1), c4 varchar(10))
1.18 :: odbc.js:querySync() => CREATE OR REPLACE TYPE SAMPLE_TYPE AS ROW ( C1 INTEGER, C2 INTEGER, C3 char(1), C4 VARCHAR(10))1.239 :: odbc.js:querySync() => CREATE OR REPLACE TYPE SAMPLE_ARR AS SAMPLE_TYPE ARRAY[100]
1.25 :: odbc.js:querySync() => CREATE OR REPLACE PROCEDURE TEST_TYPE ( IN P_ARRAY SAMPLE_ARR) BEGIN INSERT INTO ARRTAB (C1,C2,C3,C4) SELECT C1,C2,C3,C4 FROM UNNEST(P_ARRAY) AS (C1,C2, C3, C4); END
1.271 :: odbc.js:querySync() => insert into arrtab values (9, 4, 'Y', 'rock')
1.287 :: odbc.js:querySync() => select * from arrtab
Selected data for table ARRTAB =
[ { C1: 9, C2: 4, C3: 'Y', C4: 'rock' } ]
1.316 :: odbc.js:querySync() => call test_type(?)
Error: [IBM][CLI Driver][DB2/NT64] SQL0301N The value of input variable, expression or parameter number "1" cannot be used because of its data type. SQLSTATE=07006
at Database.querySync (C:\Users\r\Documents\Github\test\node_modules\ibm_db\lib\odbc.js:793:30)
at C:\Users\r\Documents\Github\test\node_modules\ibm_db\test\test-array-sp2.js:40:14
at C:\Users\r\Documents\Github\test\node_modules\ibm_db\lib\odbc.js:111:11
at C:\Users\r\Documents\Github\test\node_modules\ibm_db\lib\odbc.js:333:11 {
error: '[node-ibm_db] Error in ODBCConnection::QuerySync while executing query.',
sqlcode: -301,
state: '07006'
}
1.362 :: odbc.js:querySync() => select * from arrtab
Selected data for table ARRTAB =
[ { C1: 9, C2: 4, C3: 'Y', C4: 'rock' } ]
1.367 :: odbc.js:querySync() => drop table arrtab
有人知道是否有可能做到这一点吗?我认为这是一个常见的用例,当我们仍然使用mybatis和java时,我们很容易处理这个问题。任何帮助都将不胜感激。错误表明输入数据类型不兼容。为什么数组大小为3,并且数组有四个条目?好的,有一点上下文。我应该从这个开始。ibm_db github页面中出现了一个问题。引入了一项新功能,可通过使用阵列实现批量插入。但是他们提供的示例都具有按列绑定的特性,这意味着如果您有一个包含两列的表,则需要有两个单独的数组,以便绑定到参数标记。我提出了一个问题,是否可以使用表类型作为参数,这可以通过sql实现,如示例存储过程中所示。简言之,数组大小3是数组长度所必需的。我猜我正在寻找行绑定,这是odbc的一个特性。除非我对参数绑定的理解完全错误。存储过程需要输入参数,但不提供参数,这是一个与
node-ibm_db
功能无关的单独错误。提供空数组或填充的数组。对于node-ibm_db
而言,最好通过github而不是stackoverflow进行此操作。该参数通过传递给querySync api的queryOptions对象提供。将对象“final”作为查询选项的参数。事实上,我希望有人已经偶然发现了我类似的用例,我把它发布在这里,因为这个网站比项目的github页面有更广的覆盖范围。项目维护人员没有真正的反应,我只看到一个人回答了所有的问题,而且似乎不是所有的问题都得到了回答,特别是后续问题。