提取多条记录时从 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 文件的原因可能是啥的主要内容,如果未能解决你的问题,请参考以下文章
简化bash脚本,以sudo身份运行时从命令中提取第一个单词