在PL / SQL中处理临时LOB的最佳方法是什么

时间:2013-12-09 21:01:37

标签: oracle plsql blob clob

当谈到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的函数。我应该在函数中创建一个临时高手,并让调用者有责任释放它吗?

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,以便在会话结束之前不会出现这种情况。

1 个答案:

答案 0 :(得分:0)

这是一个建议而不是答案。我认为这是一个不好的问题,而且是主观的。

话虽如此,我通常不建议将创建和免费分开,因为它可能导致代码中的长期维护问题和滥用。我不建议在不同的地方打开和关闭流或连接。随着时间的推移,可能涉及多个开发人员这种模式可能容易出错当然总有例外。如果您正在设计API,则必须考虑如何强制您的用户正确清理。

此外,在关闭资源时也始终考虑异常处理。抛出异常代码可以阻止关闭例程的执行。

小心IN OUT参数,因为tbone建议没有完全理解使用它们的性能影响(即NOCOPY提示)。