私は以下を試しています:
INSERT INTO (blob_column) VALUES (HEXTORAW('very big hex here'))
しかし、次のエラーが発生します。
ORA-01704:文字列リテラルが長すぎます
どうすれば回避できますか?文字列から変換せずにバイナリを挿入する他の構文はありますか?
アプリケーション(VB.NetまたはC++またはphpなど)からこれを実行している場合、データが4000バイトより大きい場合は、データをチャンクでロードする必要があります(ありがとう、mustaccio)OR文字列(バイナリデータ)として送信できない値が含まれています。
このプロセスでは、データを取得し、チャンクあたり4000バイト未満のバイト「チャンク」の配列に分割します。以下の例は、これをいくつかの言語で行う方法を示しています。
これは、バイトチャンクを使用するためのOracleによるPHPの例 です。
スタックオーバーフローのC++の例 を以下に示します。
スクリプトからこれを行う場合は、 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)
)
これらの例のいずれかが適切なプログラミング言語ではない場合、または役に立たない場合は、私に知らせてください。その言語に適したものを探しましょう。
文字列リテラルを使用すると、Oracleは暗黙的な変換を実行します。したがって、実際には、挿入時にBLOBに変換されるvarcharの値を設定するだけです。その結果、不必要な制限(最大長など)や不必要な回避策(チャンクでの読み込みなど)が発生します。
最初に理解しておくべきことは、バインド変数を使用する必要があることです。それは十分に強調することはできません。バインド変数を使用すると、クエリは次のようになります。
INSERT INTO (blob_column) VALUES (:blob)
そして、クエリ全体を含む文字列を渡す代わりに、クエリとバインド変数のセットの両方をdbドライバー(どちらか選択した方)に渡します。
ドライバーの仕事は、GoタイプをOracleタイプにマップすることです。私はGoを使用していませんが、 this でトリックを実行できるようです。