问题描述
我正在尝试使用锚定到用户定义类型数组的参数来调用存储过程。我正在使用node-ibm_db npm模块。我尝试遵循在node_modules / ibm_db / test / test-test-array-insert.js中找到的样本。
我遵循ibm_db测试程序中发现的锥体概念提出了示例测试程序
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,C4 FROM UNnesT(P_ARRAY) AS (C1,C4); END")
if(err.length) { console.log(err); return; }
var paramC1 = {ParamType:"ARRAY",DataType:1,Data:[0,1,2]}
var paramC2 = {ParamType:"ARRAY",Data:[19,20,18]}
var paramC3 = {ParamType:"ARRAY",Data:['Y','N','Y']}
var paramC4 = {ParamType:"ARRAY",DataType:"VARCHAR",Data:['BMWX','TESL','TOYO'],Length:4}
var final = {ParamType:"ARRAY",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,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,c4 varchar(10))
1.18 :: odbc.js:querySync() => CREATE OR REPLACE TYPE SAMPLE_TYPE AS ROW ( C1 INTEGER,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,C4); END
1.271 :: odbc.js:querySync() => insert into arrtab values (9,'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,C4: 'rock' } ]
1.367 :: odbc.js:querySync() => drop table arrtab
有人知道甚至有可能这样做吗?我认为这是一个常见的用例,当我们仍在使用mybatis和java时,我们曾经很容易地处理此问题。任何帮助将不胜感激。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)