增加节点预言机中 OUT BIND 的大小。 NJS-016:缓冲区太小,无法在错误时进行 OUT 绑定(本机)

问题描述 投票:0回答:2

我正在使用 sails-oracle-db 适配器将我的 sails 应用程序连接到 Oracle。 https://www.npmjs.com/package/sails-oracle-db

sails-oracle-db 内部使用 https://github.com/oracle/node-oracledb

我已通过模型定义为

tableName: 'DATAPASS',
schema: true,
connection: 'oracle',
attributes: {
    id: {
        type: 'integer',
        primaryKey: true,
        autoIncrement: true
    },
    name: {
        type: 'string',
        unique: true,
        required: true
    },
    price: {
        type: 'float',
        required: true
    },
    description: {
        type: 'string'
    },
    startDate: {
        type: 'date',

    },
    endDate: {
        type: 'date',

    },
    tags: {
        type: 'json'
    },
    status: {
        type: 'integer'
    },
    assets: {
        type: 'json',
    }

在oracle数据库中,我有一个名为datapass的表,其中有一列名为asset(varchar2,其大小为4000字节)

当我将数据插入此列时,假设它的值为

var asset =[{"name":"Metered Data","identifier":"meteredData","formName":"dataAsset","multiple":false,"formFields":{"label":"28GB","value":28,"unit":"GB"}}]

然后一切都正常

但是当向 asset 数组中添加一个条目并且数据大小小于 4000Bytes

[{"name":"Metered Data","identifier":"meteredData","formName":"dataAsset","multiple":false,"formFields":{"label":"28GB","value":28,"unit":"GB"}},{"name":"Depletion Priority","identifier":"depletionPriority","multiple":false,"formName":"depletionPriority","formFields":{"label":"High","priority":"2"}}

然后它给了我

的错误
error:  Error (E_UNKNOWN) :: Encountered an unexpected error

:NJS-016:缓冲区对于 OUT 绑定来说太小 错误时(本机)

node.js oracle sails.js node-oracledb
2个回答
0
投票

通过oracle学习了node-adapter的内部,开始了解了

DML 返回绑定参数

因此,当向 Oracle 发出数据操作查询时,它会返回修改后的数据。例如

插入查询 - 返回新插入的行

更新查询——返回更新的行

现在由程序员决定我们是否想要返回该行的所有内容,或者我们是否只想要该行的某些特定列。这在 Oracle 中称为 DML 返回语句。

当返回的数据量较大时,节点预言机会抛出错误。


NJS-016: buffer is too small for OUT binds a

因此,当我们编写 DML 语句时,我们需要注意仅返回我们想要的所需列,而不是所有数据,因为它可能会溢出节点缓冲区。

假设我们有一个像

这样的 DML 语句


"UPDATE mytab SET name = :name WHERE id = :id RETURNING id, name INTO :rid,:rname"
这里我们仅返回名为 id 和 name 的两列。

但是如果我们返回一个包含大量 JSON 数据的列(例如 data),那么它会给出错误


0
投票

我在 Oracle 数据库中遇到了同样的问题,您可以按照以下步骤解决问题

问题陈述-“消息”:“NJS-016:缓冲区对于 OUT 绑定来说太小”, "stackTrace": "SequelizeDatabaseError: NJS-016: 缓冲区对于 OUT 绑定来说太小 在 OracleQuery.formatError

当我尝试使用长电子邮件 ID 登录时 [例如 -> [电子邮件受保护]] 由于某些内存空间问题,我收到此错误

解决方案->

我只是像这样测试额外的变量类型

代币:{ 类型:DataTypes.STRING, 允许空:假 }, 到

代币:{ 类型:DataTypes.TEXT, 允许空:假 },

该错误已修复

因为文本比测试占用更少的空间

  1. 另一个可能的解决方案是增加 Oracle DB 中的内存空间,但我没有找到方法来做到这一点
© www.soinside.com 2019 - 2024. All rights reserved.