将一个BLOB传递给oracleDBH来自node-oracledb

时间:2017-06-20 08:40:54

标签: node.js oracle

我有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中 - 那么一切都很完美。

想法?

2 个答案:

答案 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,问题都是一样的,因为需要缓冲区大小定义