当谈到PL / SQL中的临时LOB,即那些不会存储在数据库中的LOB时,创建和处理它们的最佳/正确方法是什么?我特别想到dbms_lob.createtemporary
和dbms_lob.free temporary
。
例如,这些案例有何不同?
-- CASE 1
DECLARE
mylob CLOB;
BEGIN
mylob = 'foo';
END;
--CASE 2
DECLARE
mylob CLOB;
BEGIN
dbms_lob.createtemporary( mylob, TRUE );
mylob = 'foo';
dbms_lob.freetemporary( mylob );
END;
假设我有一个返回LOB的函数。我应该在函数中创建一个临时高手,并让调用者有责任释放它吗?
DECLARE
myclob2 CLOB;
FUNCTION myfn RETURN CLOB IS
myclob1 CLOB := '';
BEGIN
dbms_lob.createtemporary( myclob1, TRUE );
myclob1 := 'foo';
RETURN myclob1;
END myfn;
BEGIN
myclob2 := myfn;
dbms_output.put_line( myclob2 );
dbms_lob.freetemporary( myclob2 );
END;
编辑: 我想我特别感兴趣的一件事就是如何正确处理LOB,以便在会话结束之前不会出现这种情况。
答案 0 :(得分:0)
这是一个建议而不是答案。我认为这是一个不好的问题,而且是主观的。
话虽如此,我通常不建议将创建和免费分开,因为它可能导致代码中的长期维护问题和滥用。我不建议在不同的地方打开和关闭流或连接。随着时间的推移,可能涉及多个开发人员这种模式可能容易出错当然总有例外。如果您正在设计API,则必须考虑如何强制您的用户正确清理。
此外,在关闭资源时也始终考虑异常处理。抛出异常代码可以阻止关闭例程的执行。
小心IN OUT参数,因为tbone建议没有完全理解使用它们的性能影响(即NOCOPY提示)。