UTL_FILE.FCOPY()とかFRENAME()とか Tweet
UTL_FILE.FRENAME()プロシージャとか、UTL_FILE.FCOPY()プロシージャって何かと便利っていうお話。
テストでOracleデータベース側に格納されたデータと紐づけながら画像ファイルを複製してみたり、名称を紐づけたりするときにも重宝するプロシージャなんですよね。
特に、shellなどがないWindows環境で画像を大量に複製したりする場合にはかなり便利だなと。
まずは、OS上のディレクトリとの紐付け。ディレクトリオブジェクトを作成しておきます。(今回はSCOTTユーザにディレクトリオブジェクトを作成できるように権限を付与しておきました)
SCOTT>
SCOTT> create directory ora_dir as '/home/oracle/ora_dir';
ディレクトリが作成されました。
SCOTT>
UTL_FILE.FRENAME()プロシージャは、Linux/Unixのmvコマンドライク。
以下は、リネーム後のファイル名(hogehoge.png)と同じファイルが既に存在する場合には置き換えない場合の例。overwriteパラメータをFALSE(デフォルト)にしてあげる。
SCOTT> !ls -l ora_dir
-rw-r--r-- 1 oracle oinstall 28800 2月 20 09:26 hogehoge.png
-rw-r--r-- 1 oracle oinstall 28800 2月 19 23:57 test.png
SCOTT> l
1 BEGIN
2 UTL_FILE.FRENAME('ORA_DIR','test.png','ORA_DIR','hogehoge.png',FALSE);
3* END;
SCOTT> /
BEGIN
*
行1でエラーが発生しました。:
ORA-29292: ファイル名の変更操作に失敗しました。 ORA-06512:
"SYS.UTL_FILE", 行348
ORA-06512: "SYS.UTL_FILE", 行1290
ORA-06512: 行2
SCOTT> !ls -l ora_dir
-rw-r--r-- 1 oracle oinstall 28800 2月 20 09:26 hogehoge.png
-rw-r--r-- 1 oracle oinstall 28800 2月 19 23:57 test.png
以下は、リネーム後のファイル名(hogehoge.png)と同じファイルが既に存在する場合に置き換えてしまう例。overwriteパラメータをTRUEにしてあげる。
SCOTT> !ls -l ora_dir
-rw-r--r-- 1 oracle oinstall 28800 2月 20 09:26 hogehoge.png
-rw-r--r-- 1 oracle oinstall 28800 2月 19 23:57 test.png
SCOTT> l
1 BEGIN
2 UTL_FILE.FRENAME('ORA_DIR','test.png','ORA_DIR','hogehoge.png',TRUE);
3* END;
SCOTT> /
PL/SQLプロシージャが正常に完了しました。
SCOTT> !ls -l ora_dir
-rw-r--r-- 1 oracle oinstall 28800 2月 19 23:57 hogehoge.png
SCOTT>
せっかくUTL_FILE.FRENAME()プロシージャを試したので、次いでにUTL_FILE.FCOPY()でファイルコピーも!
といきたいところですが、UTL_FILE.FCOPY()プロシージャはテキストファイルのコピーしか行えない!(パラメータからも想像できると思うけど)
では、画像ファイルなどのバイナリファイルはどうすんのさ!オラクルさん!。ってことで、そのようなプロシージャは無いので自前で作りましょ。
以下は、そのサンプル、バイナリモードで画像ファイルを読み込んでバイナリモードで別ファイルへ書き出す。だたそれだけ。
SCOTT> !ls -l ora_dir
-rw-r--r-- 1 oracle oinstall 28800 2月 19 23:13 test2.png
SCOTT>
SCOTT> l
1 DECLARE
2 src_file UTL_FILE.FILE_TYPE;
3 dst_file UTL_FILE.FILE_TYPE;
4 buffer RAW(32767);
5 BEGIN
6 src_file := UTL_FILE.FOPEN('ORA_DIR','test2.png', 'rb', 32767);
7 dst_file := UTL_FILE.FOPEN('ORA_DIR','hogehogehoge.png', 'wb', 32767);
8 LOOP
9 BEGIN
10 UTL_FILE.GET_RAW(src_file, buffer, 32767);
11 UTL_FILE.PUT_RAW(dst_file, buffer, TRUE);
12 EXCEPTION
13 WHEN NO_DATA_FOUND THEN
14 EXIT;
15 END;
16 END LOOP;
17 UTL_FILE.FCLOSE(src_file);
18 UTL_FILE.FCLOSE(dst_file);
19* END;
SCOTT> /
PL/SQLプロシージャが正常に完了しました。
SCOTT> !ls -l ora_dir
-rw-r--r-- 1 oracle oinstall 28800 2月 19 23:57 hogehogehoge.png
-rw-r--r-- 1 oracle oinstall 28800 2月 19 23:13 test2.png
SCOTT>
| 固定リンク | 0
コメント
困ったときは、いつでも、MacDeさんに助けてもらってます
ありがとうございます
メリークリスマス
この記事をもっと早く読めばよかった
投稿: 吉田もとたか | 2015年12月22日 (火) 19時25分
お役に立ったようでなによりです :)
投稿: discus | 2015年12月22日 (火) 19時42分