web-dev-qa-db-ja.com

Oracleに大きなblobデータを挿入する方法は?

私は以下を試しています:

INSERT INTO (blob_column) VALUES (HEXTORAW('very big hex here'))

しかし、次のエラーが発生します。

ORA-01704:文字列リテラルが長すぎます

どうすれば回避できますか?文字列から変換せずにバイナリを挿入する他の構文はありますか?

2
Andrey Nering

アプリケーション(VB.NetまたはC++またはphpなど)からこれを実行している場合、データが4000バイトより大きい場合は、データをチャンクでロードする必要があります(ありがとう、mustaccio)OR文字列(バイナリデータ)として送信できない値が含まれています。

このプロセスでは、データを取得し、チャンクあたり4000バイト未満のバイト「チャンク」の配列に分割します。以下の例は、これをいくつかの言語で行う方法を示しています。

これは、バイトチャンクを使用するためのOracleによるPHPの例 です。

スタックオーバーフローのC++の例 を以下に示します。

これは、Code ProjectのC#.Netの例 です。

スクリプトからこれを行う場合は、 SQL * Loader を確認してください。

LOAD DATA 
INFILE example13.dat 
INTO TABLE EXAMPLE13 
FIELDS TERMINATED BY ',' 
( EMPNO INTEGER EXTERNAL, 
ENAME CHAR, 
JOB CHAR, 
MGR INTEGER EXTERNAL, 
SAL DECIMAL EXTERNAL, 
COMM DECIMAL EXTERNAL, 
DEPTNO INTEGER EXTERNAL, 
RES_FILE FILLER CHAR(60), 
"IMAGE" BFILE(CONSTANT "ORDIMGDIR", RES_FILE) 
)

これらの例のいずれかが適切なプログラミング言語ではない場合、または役に立たない場合は、私に知らせてください。その言語に適したものを探しましょう。

3
CaM

文字列リテラルを使用すると、Oracleは暗黙的な変換を実行します。したがって、実際には、挿入時にBLOBに変換されるvarcharの値を設定するだけです。その結果、不必要な制限(最大長など)や不必要な回避策(チャンクでの読み込みなど)が発生します。

最初に理解しておくべきことは、バインド変数を使用する必要があることです。それは十分に強調することはできません。バインド変数を使用すると、クエリは次のようになります。

INSERT INTO (blob_column) VALUES (:blob)

そして、クエリ全体を含む文字列を渡す代わりに、クエリとバインド変数のセットの両方をdbドライバー(どちらか選択した方)に渡します。

ドライバーの仕事は、GoタイプをOracleタイプにマップすることです。私はGoを使用していませんが、 this でトリックを実行できるようです。

3
Paul