web-dev-qa-db-ja.com

BLOB Oracle 10gへの画像の挿入

署名のBLOBフィールドに画像を挿入しようとしていますが、これをテーブルから選択してレポートに表示します。画像をテーブルに取り込む方法を理解できないようです。しかし、画像へのパスのみがレポートに表示され、画像自体は表示されないときに挿入を行いました。

テーブル

CREATE TABLE esignatures (
  office   NUMBER(6,0)  NOT NULL,
  username VARCHAR2(10) NOT NULL,
  iblob    BLOB         NOT NULL
)

INSERTステートメント(SQL)

INSERT INTO esignatures  
VALUES (100, 'BOB', utl_raw.cast_to_raw('C:\pictures\image1.png'));

私は確かにHEX値の形式で文字列の場所を挿入していることを知っています。テーブルで画像のHEX値を取得するにはどうすればよいですか?.

13
devdar

Pl/sqlからローカルディレクトリにアクセスすることはできません。 bfileを使用する場合、Oracleが実行されているサーバー上に、イメージを配置する必要のあるディレクトリー( create directory )をセットアップします。

ローカルマシンから少数の画像を挿入する場合、これを行うにはクライアント側のアプリが必要です。独自に作成することもできますが、通常はToadを使用します。スキーマブラウザで、テーブルをクリックします。 [データ]タブをクリックし、+記号を押して行を追加します。 BLOB列をダブルクリックすると、ウィザードが開きます。左端のアイコンは画像をブロブにロードします:

enter image description here

SQL Developerにも同様の機能があります。以下の「ロード」リンクを参照してください。

enter image description here

ネットワーク上で画像をプルする必要がある場合は、pl/sqlを使用して実行できますが、簡単ではありません。最初に、ユーザーがネットワーク経由でプルできるように、ACLリストアクセスを設定する必要があります(セキュリティ上の理由から)。 ACLのセットアップの詳細については、 この記事 を参照してください。

ACLが完全であると仮定すると、次のようにイメージをプルします。

declare
    l_url varchar2(4000) := 'http://www.oracleimg.com/us/assets/12_c_navbnr.jpg';
    l_http_request   UTL_HTTP.req;
    l_http_response  UTL_HTTP.resp;
    l_raw RAW(2000);
    l_blob BLOB;
begin
   -- Important: setup ACL access list first!

    DBMS_LOB.createtemporary(l_blob, FALSE);

    l_http_request  := UTL_HTTP.begin_request(l_url);
    l_http_response := UTL_HTTP.get_response(l_http_request);

  -- Copy the response into the BLOB.
  BEGIN
    LOOP
      UTL_HTTP.read_raw(l_http_response, l_raw, 2000);
      DBMS_LOB.writeappend (l_blob, UTL_RAW.length(l_raw), l_raw);
    END LOOP;
  EXCEPTION
    WHEN UTL_HTTP.end_of_body THEN
      UTL_HTTP.end_response(l_http_response);
  END;

  insert into my_pics (pic_id, pic) values (102, l_blob);
  commit;

  DBMS_LOB.freetemporary(l_blob); 
end;

お役に立てば幸いです。

16
tbone

次のようにする必要があります。

1)サーバー側のアクセス可能なフォルダーを指すディレクトリオブジェクトを作成します

CREATE DIRECTORY image_files AS '/data/images'
/

2)ファイルをOSフォルダーのディレクトリオブジェクトに配置し、オブジェクトが指すようにする

3)ファイルからテーブルにデータをロードするOracleスキーマに必要なアクセス権限を付与します。

GRANT READ ON DIRECTORY image_files TO scott
/

4)以下のように、BFILENAME、EMPTY_BLOB関数、およびDBMS_LOBパッケージ(テストされていない例-注意してください)を使用します。

DECLARE
  l_blob BLOB; 
  v_src_loc  BFILE := BFILENAME('IMAGE_FILES', 'myimage.png');
  v_amount   INTEGER;
BEGIN
  INSERT INTO esignatures  
  VALUES (100, 'BOB', empty_blob()) RETURN iblob INTO l_blob; 
  DBMS_LOB.OPEN(v_src_loc, DBMS_LOB.LOB_READONLY);
  v_amount := DBMS_LOB.GETLENGTH(v_src_loc);
  DBMS_LOB.LOADFROMFILE(l_blob, v_src_loc, v_amount);
  DBMS_LOB.CLOSE(v_src_loc);
  COMMIT;
END;
/

この後、BLOB列でファイルのコンテンツを取得し、Javaを使用して取得できます。

編集:1文字が欠落している:それはLOADFROMFILEでなければなりません。

8