0

我正在使用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 的表,其中有一个名为 assets 的列( varchar2 ,其大小为 4000 字节)

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

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

然后一切正常

但是当向资产数组添加一个条目并且数据的大小小于 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:缓冲区太小,无法在错误时绑定(本机)

4

1 回答 1

0

我通过 oracle 了解了 node-adapter 的内部并了解了

DML RETURNING 绑定参数

所以当数据操作查询被触发到 oracle 时,它​​会返回修改后的数据。例如

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

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

现在由程序员决定我们是想要返回行的所有内容还是只想要行的某些特定列。这在 oracle 中称为 DML Returning statements。

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

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 only 的两列。

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

于 2016-10-03T09:29:53.060 回答