テーブルblobtableがあり、BLOB列blobcolがあります。ユーザーは次のようなコマンドを使用してテーブルを更新しました:
UPDATE BLOBTABLE
SET BLOBCOL=BFILENAME('directory/subdirectory', 'filename.txt')
WHERE ROWID='ROWIDVALUE';
この更新が実行される前に、ファイルfilename.txtがディレクトリに存在していたことに注意してください。
現在、ユーザーは、(PL/SQL開発者を使用して)blobtableから選択すると、この行の「値エラー」がblobcolに含まれると言っています。通常、blobcolには値「BFILE」が含まれます。好奇心から、SQL * Plusで同じレコードを選択しようとすると、blobcolに次の値が表示されます。
bfilename(directory/subdirectory '、' filename.txt ')
私はBLOBとその機能にあまり詳しくないので、私の質問は次のとおりです。
これは、BLOB
フィールドをロードする方法ではありません。 BFILENAME
はBFILE
ロケーターを返し、BFILE
データはデータベースに格納されず、データベースの外部にあるがデータベースにアクセスできるファイルに格納されます。
上記のコマンドは、BLOBCOLが実際にBLOB
タイプである場合でも成功しません。以下のエラーが発生します。
ORA-00932: inconsistent datatypes: expected BLOB got FILE
もう1つの間違いは、BFILENAME
が、ファイルシステム上のディレクトリパスではなく、ディレクトリデータベースオブジェクトの名前を期待することです。
BLOB
フィールドをファイルの内容で更新する場合は、次のようにします。
CREATE DIRECTORY MY_DIR AS '/directory/subdirectory';
DECLARE
src_bfile BFILE := BFILENAME('MY_DIR', 'filename.txt');
dest_blob BLOB;
BEGIN
SELECT BLOBCOL into dest_blob FROM BLOBTABLE WHERE ROWID = 'ROWIDVALUE';
DBMS_LOB.OPEN(src_bfile, DBMS_LOB.LOB_READONLY);
DBMS_LOB.LoadFromFile( DEST_LOB => dest_blob,
SRC_LOB => src_bfile,
AMOUNT => DBMS_LOB.GETLENGTH(src_bfile) );
DBMS_LOB.CLOSE(src_lob);
COMMIT;
END;
/
Value Error
メッセージの原因については、テーブルの構造やロードの正確な方法はわかりませんが、不適切なメソッドで行われたと思います。
最後に、ファイルが本当にプレーンテキストファイルである場合(.txt
のために推測するだけ)、CLOB
ではなくBLOB
に保存することができます。