web-dev-qa-db-ja.com

BLOB列の更新

テーブル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とその機能にあまり詳しくないので、私の質問は次のとおりです。

  1. ユーザーはblobcolを適切に更新しましたか?
  2. 「値エラー」の原因は何ですか?これはどのように修正できますか?
2
andba77

これは、BLOBフィールドをロードする方法ではありません。 BFILENAMEBFILEロケーターを返し、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に保存することができます。

7
Balazs Papp