【问题标题】:OS file from BLOB in Oracle来自 Oracle 中 BLOB 的 OS 文件
【发布时间】:2012-09-18 04:32:07
【问题描述】:

我正在考虑是否可以将 Oracle blob 写入操作系统文件。乍一看,可能只使用外部程序,但可能会有所改变......

如何在 PL/SQL 中将 BLOB 保存到磁盘上的文件 来自:Thomas Kyte

使用 DBMS_LOB 从 BLOB 中读取

您需要创建一个外部过程来获取二进制数据和 写入操作系统,外部程序即可 用C写的,如果是CLOB数据,可以用UTL_FILE写到 操作系统,但 UTL_FILE 不支持 BLOB 中的二进制文件。

【问题讨论】:

标签: oracle plsql


【解决方案1】:

使用 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;
/

【讨论】:

    猜你喜欢
    • 2020-04-03
    • 2013-12-04
    • 1970-01-01
    • 2012-04-08
    • 2016-02-22
    • 2013-11-08
    • 2013-12-11
    • 2015-01-29
    • 2012-08-23
    相关资源
    最近更新 更多