在 PL/SQL 中处理临时 LOB 的最佳方法是啥
Posted
技术标签:
【中文标题】在 PL/SQL 中处理临时 LOB 的最佳方法是啥【英文标题】:What is the best way of handling a temporary LOB in PL/SQL在 PL/SQL 中处理临时 LOB 的最佳方法是什么 【发布时间】:2013-12-09 21:01:37 【问题描述】:对于 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 的函数。我应该在函数中创建一个临时 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,以便它在会话结束之前不会一直存在。
【问题讨论】:
我偏爱使用带有“in out”参数的过程。更容易维护 imo。如果我有时间,我稍后会发布一个示例 【参考方案1】:这更多的是建议而不是答案。我认为这是一个不好的问题,而且是主观的。
话虽如此,我通常不建议将 create 和 free 分开,因为这会导致长期维护问题和代码滥用。同样,我不建议在不同的地方打开和关闭流或连接。随着时间的推移,可能涉及到多个开发人员,这种模式可能容易出错。当然,总是有例外。如果您正在设计 API,则必须考虑如何强制用户正确清理。
另外,关闭资源时也要考虑异常处理。中间代码抛出的异常可以阻止关闭例程的执行。
在不完全理解使用它们的性能影响(即 NOCOPY 提示)的情况下,小心使用 tbone 建议的 IN OUT 参数。
【讨论】:
以上是关于在 PL/SQL 中处理临时 LOB 的最佳方法是啥的主要内容,如果未能解决你的问题,请参考以下文章
Oracle:PL/SQL 中查看值是不是存在的最快方法:列表、VARRAY 或临时表