Иногда возникает необходимость записать данные в файл, а возможностей UTL_FILE нехватает. В таком случае можно воспользоваться хранимыми процедурами на Java.
1. Создаем Java class
| Код | create or replace and compile java source named write_to_client as import java.io.*; import java.sql.*;
public class NetWrite { public static void writeToFile(String file, Blob data) throws Exception { FileOutputStream out = new FileOutputStream(file); InputStream in = data.getBinaryStream(); int read; byte[] buffer = new byte[16 * 1024]; while((read = in.read(buffer)) != -1) out.write(buffer, 0, read); in.close(); out.close(); } } / |
2. Создаем процедуру на PL/SQL
| Код | create or replace procedure WRITE_CLIENT(file varchar2, data blob) as language java name 'NetWrite.writeToFile(java.lang.String, java.sql.Blob)'; |
3. Выдаем разрешения на чтение и запись любого файла (при желании, можно ограничить процедуру записью, лишь в некоторые файлы/директории)
| Код | begin sys.dbms_java.grant_permission('PUBLIC', 'java.io.FilePermission', '<<ALL FILES>>', 'read,write'); end; / |
4. Проверяем
| Код | declare bin_data blob; begin select photo_data into bin_data from photos where id = 'D490AA09AEF3424A9AEEFAAC638B283E'; write_client('C:\TEMP\foto.jpeg', bin_data); end; / |
|