gpt4 book ai didi

oracle - pl/sql 中用于将 bfile 读入 blob 的函数不显示结果

转载 作者:行者123 更新时间:2023-12-05 06:47:13 24 4
gpt4 key购买 nike

你能告诉我,为什么这个函数返回一个空的 blob 值吗?它甚至不会在循环后关闭 BFILE 类型变量。我无法想象问题出在哪里。

FUNCTION f$bfile_to_blob
(I_FID_ID IN INTEGER)
RETURN BLOB IS
bf BFILE;
Amount INTEGER := 32767;
Position integer := 1;
buffer RAW(32767);
bl LONG RAW := '';

bb BLOB;

BEGIN
select fid_bckp into bf
from filedoc
where fid_id = I_FID_ID;

dbms_lob.open(bf, dbms_lob.lob_readonly);

DBMS_LOB.CREATETEMPORARY(bb, TRUE, DBMS_LOB.SESSION);
LOOP
dbms_lob.read(bf, Amount, Position, buffer);
dbms_lob.writeappend(bb,amount,buffer);
Position := Position + Amount;
END LOOP;

dbms_lob.close(bf);

return bb;

END;

我这样调用函数

select F$BFILE_TO_BLOB(fid_id) from filedoc where fid_id = 2150;

最佳答案

您的逻辑很复杂,您混合了许多可能产生错误的元素:即 CLOB 和 BFILE。您应该首先尝试隔离函数中的哪个元素导致了这种异常行为。

我建议您运行一个简单的函数来确保您的 BLOB 逻辑没有问题:

create or replace FUNCTION f$bfile_to_blob
RETURN BLOB IS
bb BLOB;
BEGIN
DBMS_LOB.CREATETEMPORARY(bb, TRUE, DBMS_LOB.SESSION);
bb := hextoraw('FFFFFFFF');
return bb;
END;

select rawtohex(dbms_lob.substr(f$bfile_to_blob, 4000, 1)) from dual;

这应该产生 FFFFFFFF。现在您知道问题在于您对 BFILE 对象的读取。我们可以在您的代码中看到您有一个没有退出条件的循环。由于程序退出,我们推断您的循环退出时出现错误。

documentation解释异常是由 READ 过程引发的:

The number of bytes or characters actually read is returned in the amount parameter. If the input offset points past the End of LOB, then amount is set to 0, and a NO_DATA_FOUND exception is raised.

异常被抛出,函数没有返回任何东西就退出了。

如您所知,NO_DATA_FOUND 异常不被视为 SQL 语句中的错误。 SELECT 查询将错误解释为 NULL

你应该修改你的函数来捕捉这个错误并优雅地退出循环:

FUNCTION f$bfile_to_blob(I_FID_ID IN INTEGER)
RETURN BLOB IS
bf BFILE;
Amount INTEGER := 32767;
Position INTEGER := 1;
buffer RAW(32767);
bl LONG RAW := '';
bb BLOB;
BEGIN
SELECT fid_bckp
INTO bf
FROM filedoc
WHERE fid_id = I_FID_ID;
dbms_lob.open(bf, dbms_lob.lob_readonly);
DBMS_LOB.CREATETEMPORARY(bb, TRUE, DBMS_LOB.SESSION);

LOOP
BEGIN
dbms_lob.read(bf, Amount, Position, buffer);
EXCEPTION
WHEN NO_DATA_FOUND THEN
EXIT;
END;
dbms_lob.writeappend(bb, amount, buffer);
Position := Position + Amount;
END LOOP;

dbms_lob.close(bf);

RETURN bb;
END;

关于oracle - pl/sql 中用于将 bfile 读入 blob 的函数不显示结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12263816/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com