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データベースには、assetという名前の列を持つdatapassという名前のテーブルがあります(varchar2とそのサイズは4000バイトです)

この列にデータを挿入すると、値が次のようになります

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

その後、すべてが正常に機能しています

しかし、アセット配列にもう 1 つのエントリを追加し、データのサイズが 4000 バイト未満の場合

[{"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 バインドに対してバッファーが小さすぎます (ネイティブ)

4

1 に答える 1

0

node-adapter の内部を oracle で学び、

DML RETURNING バインド パラメータ

そのため、データ操作クエリがオラクルに発行されると、変更されたデータが返されます。例えば

挿入クエリ - 新しく挿入された行を返します

更新クエリ -- 更新された行を返しました

行のすべてのコンテンツを返すか、行の特定の列だけを返すかはプログラマ次第です。これはオラクルでは DML Returning ステートメントとして知られています。

返されるデータの量が多い場合、node-oracle はエラーをスローします。

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 のみという名前の 2 つの列のみを返しています。

しかし、膨大な量の JSON データを含むデータなどの列を返すと、エラーが発生します

于 2016-10-03T09:29:53.060 に答える