我正在使用 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 绑定来说太小 错误时(本机)
通过oracle学习了node-adapter的内部,开始了解了
因此,当向 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),那么它会给出错误
我在 Oracle 数据库中遇到了同样的问题,您可以按照以下步骤解决问题
问题陈述-“消息”:“NJS-016:缓冲区对于 OUT 绑定来说太小”, "stackTrace": "SequelizeDatabaseError: NJS-016: 缓冲区对于 OUT 绑定来说太小 在 OracleQuery.formatError
当我尝试使用长电子邮件 ID 登录时 [例如 -> [电子邮件受保护]] 由于某些内存空间问题,我收到此错误
解决方案->
我只是像这样测试额外的变量类型
代币:{ 类型:DataTypes.STRING, 允许空:假 }, 到
代币:{ 类型:DataTypes.TEXT, 允许空:假 },
该错误已修复
因为文本比测试占用更少的空间