署名の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値を取得するにはどうすればよいですか?.
Pl/sqlからローカルディレクトリにアクセスすることはできません。 bfileを使用する場合、Oracleが実行されているサーバー上に、イメージを配置する必要のあるディレクトリー( create directory )をセットアップします。
ローカルマシンから少数の画像を挿入する場合、これを行うにはクライアント側のアプリが必要です。独自に作成することもできますが、通常はToadを使用します。スキーマブラウザで、テーブルをクリックします。 [データ]タブをクリックし、+記号を押して行を追加します。 BLOB列をダブルクリックすると、ウィザードが開きます。左端のアイコンは画像をブロブにロードします:
SQL Developerにも同様の機能があります。以下の「ロード」リンクを参照してください。
ネットワーク上で画像をプルする必要がある場合は、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;
お役に立てば幸いです。
次のようにする必要があります。
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でなければなりません。