使用 DB Job 将文件从表迁移到 OS 文件 de SO
基于表 fou_archvos 的示例,它在“archivo”列上有文件,id+nombre 将被连接。
SQL> desc fou_archvos
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NOT NULL NUMBER
NOMBRE NOT NULL VARCHAR2(300)
ACTIVO NOT NULL CHAR(1)
ARCHIVO BLOB
在操作系统上创建一个文件夹,它应该具有操作系统Oracle用户所有者的权限。
su - oracle
mkdir /tmp/fou_archvo
在 DB 上创建目录对象,例如 TUKLI_FOU_ARCHVOS,授予程序所在的方案权限,例如 PROD。
connect system/***@DB
CREATE OR REPLACE DIRECTORY TUKLI_FOU_ARCHVOS AS '/tmp/fou_archvos';
GRANT READ, WRITE ON DIRECTORY TUKLI_FOU_ARCHVOS TO PROD;
创建 el TU24X7_ARCHVES_TO_OSFILE.prc en PROD 方案,对象
CREATE or replace PROCEDURE TU24X7_ARCHVES_TO_OSFILE(p_from_id number default null )
as
l_file UTL_FILE.FILE_TYPE;
l_buffer RAW(32767);
l_amount BINARY_INTEGER := 32767;
l_pos INTEGER;
--l_blob BLOB;
l_blob_len INTEGER;
l_id varchar2(10);
BEGIN
FOR rFile IN (SELECT archivo, to_char(id)||'_'||nombre filename
FROM fou_archvos
where 1=1
and id >= nvl(p_from_id,id)
)
LOOP
l_pos := 1;
l_blob_len := DBMS_LOB.getlength(rFile.archivo);
l_file := UTL_FILE.fopen('TUKLI_FOU_ARCHVOS',rFile.filename,'wb', 32767);
WHILE l_pos <= l_blob_len LOOP
DBMS_LOB.read(rFile.archivo, l_amount, l_pos, l_buffer);
UTL_FILE.put_raw(l_file, l_buffer, TRUE);
l_pos := l_pos + l_amount;
END LOOP;
-- Close the file.
UTL_FILE.fclose(l_file);
END LOOP;
EXCEPTION
WHEN OTHERS THEN
-- Close the file if something goes wrong.
IF UTL_FILE.is_open(l_file) THEN
UTL_FILE.fclose(l_file);
END IF;
RAISE;
END;
/
使用 JOB DB 执行
连接 PROD/XX@DB
declare
l_jobid number := null;
begin
dbms_job.submit
(
job => l_jobid,
what => 'TU24X7_ARCHVES_TO_OSFILE;',
next_date => sysdate,
interval => null
);
commit;
end;
/