在 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.createtemporarydbms_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 LOB类型

Oracle:PL/SQL 中查看值是不是存在的最快方法:列表、VARRAY 或临时表

oracle--pl/sql变量定义----

将 100,000 条记录从 PL/SQL 程序输出到 XML 文件的最佳方法

PL/SQL 过程中的异常处理

PL/SQL:如何根据列值插入