提取多条记录时从 plsql 脚本生成空 jpg 文件的原因可能是啥

Posted

技术标签:

【中文标题】提取多条记录时从 plsql 脚本生成空 jpg 文件的原因可能是啥【英文标题】:What could be the reason for empty jpg file generated from plsql script when extracting more than one record提取多条记录时从 plsql 脚本生成空 jpg 文件的原因可能是什么 【发布时间】:2017-04-04 04:49:37 【问题描述】:

我在 plsql 中有这个脚本,我试图将图像提取到我在数据库中有 100 条记录的目录中,代码正在提取所有记录,但它们是空白文件,可能是什么问题。

下面是代码块,请帮忙。

--create or replace directory my_dir as '/export/home/Desktop/Pic';

DECLARE

v_dir varchar2(10):='MY_DIR';
t_blob BLOB;
t_len NUMBER;
t_file_name VARCHAR2(100);
t_output UTL_FILE.file_type;
t_TotalSize number;
t_position number := 1;
t_chucklen NUMBER := 4096;
t_chuck raw(4096);
t_remain number;

BEGIN
FOR i IN 1..100 LOOP


SELECT DBMS_LOB.getlength (IMAGE), brid ||'P.jpg'
    INTO t_TotalSize, t_file_name FROM Photo WHERE IMAGEID=i;

IF (t_file_name IS NOT NULL) THEN


dbms_output.put_line('Got: ' || t_file_name);

t_remain := t_TotalSize;
t_output := UTL_FILE.fopen (v_dir, t_file_name, 'WB', 32760);

SELECT IMAGE INTO t_blob FROM Photo WHERE IMAGEID=i;

WHILE t_position < t_TotalSize LOOP
    DBMS_LOB.READ (t_blob, t_chucklen, t_position, t_chuck);
    UTL_FILE.put_raw (t_output, t_chuck);
    UTL_FILE.fflush (t_output);
    t_position := t_position + t_chucklen;
    t_remain := t_remain - t_chucklen;
    IF t_remain < 4096
    THEN
        t_chucklen := t_remain;
    END IF;
END LOOP;
END IF;
END LOOP;
UTL_FILE.fclose (t_output);
END; 

【问题讨论】:

嗨,我创建了一个带有 BLOB 列的表,在其中插入了一张照片并调用了你的代码,它 WORKS,所以也许你在其他地方有问题(可能是表本身或可能是插入过程) 感谢您的回复,但是当我只为一条记录调用上面的代码时它工作正常,挑战是当表有多个记录并且我想提取所有记录时。 在循环内设置 t_position := 0 我已将其设置为 0,但现在收到以下错误 ORA-21560: argument 2 is null, invalid, or out of range ORA-06512: at "SYS.DBMS_LOB", line 1056 ORA-06512: at line 34 抱歉设置为1 【参考方案1】:

我建议移动 UTL_FILE.fclose (t_output);在结束之前如果:

END LOOP;
UTL_FILE.fclose (t_output);
END IF;
END LOOP;

【讨论】:

以上是关于提取多条记录时从 plsql 脚本生成空 jpg 文件的原因可能是啥的主要内容,如果未能解决你的问题,请参考以下文章

在plsql中使用游标更新多条记录

PLSQL 中的 LIMIT 子句用法

简化bash脚本,以sudo身份运行时从命令中提取第一个单词

PLSQL——02变量的使用

2018.5.30 Oracle数据库PLSQL编程---游标的使用

在播放 iOS 时从 HLS 流(视频)中提取/录制音频