我有db package方法,带有以下签名
PROCEDURE p_add_rate_tables (p_in IN OUT BLOB, p_message IN OUT VARCHAR2);
现在从node-oracledb传递params我传递了以下代码
const mergedTrunks = trunks.map(t =>
`["${t.xxx1}", "${t.xxx2}", "${t.xxx3}"]`
).join(', ');
const buffer = Buffer.from(`[${mergedTrunks}]`);
const bindvars = {
p_in: {val: buffer, type: oracledb.BUFFER, dir: oracledb.BIND_INOUT},
p_message: {type: oracledb.STRING, dir: oracledb.BIND_INOUT}
};
return new Promise((resolve, reject) => {
connection.execute(
`
begin
${config.database}.pkg_trunks.p_add_rate_tables (:p_in, :p_message);
commit;
end;`,
bindvars)
但无论我做什么以及如何使用参数 - 在数据库方面它们都没有被正确解析 - 我无法在DB上看到原因,或者至少我们的数据库人员无法解决。
这不是形成问题 - 因为如果我把实际的字符串放到oracle utl_raw.cast_to_raw中 - 那么一切都很完美。
想法?
答案 0 :(得分:0)
这是对地图的快速测试:
const trunks = ['test1', 'test2', 'test3'];
const mergedTrunks = trunks.map(t =>
`["${t.xxx1}", "${t.xxx2}", "${t.xxx3}"]`);
console.log(mergedTrunks); // ["["undefined", "undefined", "undefined"]", "["undefined", "undefined", "undefined"]", "["undefined", "undefined", "undefined"]"]
这是一个稍微修改过的版本,它正确使用了模板文字:
const trunks = ['test1', 'test2', 'test3'];
const mergedTrunks = trunks.map(t =>
`["${t}.xxx1", "${t}.xxx2", "${t}.xxx3"]`);
console.log(mergedTrunks); // ["["test1.xxx1", "test1.xxx2", "test1.xxx3"]", "["test2.xxx1", "test2.xxx2", "test2.xxx3"]", "["test3.xxx1", "test3.xxx2", "test3.xxx3"]"]
首先修复它并查看它的位置。
答案 1 :(得分:0)
对于遇到此问题/问题的人。 显然它不是关于模板或数据 - 因为没有主体会重建我们拥有的模式(这是一个非常复杂的DB模式,而DBA几乎没有维护)
问题不在于实际的序列化,而是在返回的路上! 你可以看到变量是INOUT变量,
p_in: {val: buffer, type: oracledb.BUFFER, dir: oracledb.BIND_INOUT}
但是如果回程中的变量大于路上的变量会发生什么? BOOM,一个无法解释的错误。 因此,您需要指定缓冲区的大小以获取元素,使用
可以轻松完成maxSize: 4000
所以完整的定义应该是
p_in: {val: buffer, type: oracledb.BUFFER, dir: oracledb.BIND_INOUT, maxSize: 4000},
就是这样 - 一切正常,无论你使用CLOB还是BLOB,问题都是一样的,因为需要缓冲区大小定义