Ask Tom之中英文对照20051228——PL/SQL函数返回CLOB类型值

问:

我已经通读了相关文档,但是在实际应用中仍然不太清楚我的理解是否确切。

我已经创建了如下的函数——产生一个小的结果集的游标查询实例,用合并varchar2变量返回一个clob类型值来做试验。

create or replace function testclob return clob
as
    v_clob clob;
begin
    dbms_lob.createtemporary(v_clob,FALSE,DBMS_LOB.CALL);
    dbms_lob.open(v_clob,dbms_lob.lob_readwrite);
    for val in (select 'abc' colalias from dual union
                select 'def' colalias from dual union
                select 'ghi' colalias from dual)
    loop
        dbms_lob.writeAppend( v_clob, length(val.colalias), val.colalias );
    end loop;

return v_clob;
end;

由于我实际返回了clob类型值,因此我没有利用这个函数执行如下语句:

dbms_lob.close(v_clob);
    dbms_lob.freetemporary(v_clob);

我在sql/plus中用如下语句测试:

variable c clob
exec :c := testclob
print c

我得到了预期的结果。然而,当我执行

select * from v$temporary_lobs

在同一个sql/plus会话中我做的多次函数调用,nocache_lobs的数据好像是不断增加,而不是保持在1。

最后,我用一个JDBC的java客户端调用类似上述函数,不过在多次调用之间会话保持打开。我要确保这些句柄范围的正确,以保证内存的使用没有过时。

怎样返回clob类型值,并且在适当的时候释放它呢?

请帮帮我,指导我在此类情形下的如何选择。

谢谢!

回答:

在应用开发指导中关于LOBS的描述如下:

<quote>
注意:DBMS_LOB.CREATETEMPORARY存储过程有一个可选的持续时间参数。在PL/SQL中,这个持续时间参数只作为LOB数据持续时间的隐含参数。PL/SQL在内部自动计算LOB数据的持续时间,替换你的帐号中的隐含参数。你并不需要特别指定LOB数据的持续时间。
</quote>

在你那种情况下,这样做比较好——既然你返回LOB值到客户端,仅仅在函数调用的那一瞬间的范围对你来说是不合适的。这个调用是函数调用。如果PL/SQL并没有意识到你返回了CLOB值,在实际中由于需要释放了该值,那么这个调用就没有任何内容可以输出。

如果你的目的是在一个会话中用一个LOB,必须满足以下两条:

o 你做完之后释放这个LOB。就像你读完一个文件要关闭它,或者当你知道不在需要一个游标而释放它一样。

o 在程序包中使用单一LOB。

在程序包中使用单一LOB,你可以用如下代码:

ops$tkyte@ORA817DEV.US.ORACLE.COM> create or replace package testclob_pkg
  2  as
  3  
  4      function testclob( p_data in varchar2 ) return clob;
  5  
  6  end;
  7  /

Package created.

ops$tkyte@ORA817DEV.US.ORACLE.COM>
ops$tkyte@ORA817DEV.US.ORACLE.COM> create or replace package body testclob_pkg
  2  as
  3  
  4  g_clob     clob;
  5  
  6  
  7  function testclob( p_data in varchar2 ) return clob
  8  as
  9  begin
10      dbms_lob.trim( g_clob, 0 );
11      for val in (select p_data colalias from dual union all
12                  select ' abc' colalias from dual union all
13                  select ' def' colalias from dual union all
14                  select ' ghi' colalias from dual)
15      loop
16          dbms_lob.writeAppend( g_clob, length(val.colalias), val.colalias );
17      end loop;
18  
19      return g_clob;
20  end;
21  
22  
23  begin
24      -- elaboration code, run once when package
25      -- is first accessed in a sesion
26      dbms_lob.createtemporary(g_clob,FALSE);
27      dbms_lob.open(g_clob,dbms_lob.lob_readwrite);
28  end;
29  /

Package body created.

ops$tkyte@ORA817DEV.US.ORACLE.COM>
ops$tkyte@ORA817DEV.US.ORACLE.COM> select * from v$temporary_lobs;

no rows selected

ops$tkyte@ORA817DEV.US.ORACLE.COM> declare
  2      l_clob clob;
  3  begin
  4      for i in 1 .. 10
  5      loop
  6          l_clob := testclob_pkg.testclob( 'loop ' || i  || ',' );
  7          dbms_output.put_line( dbms_lob.substr( l_clob, 250, 1 ) );
  8      end loop;
  9  end;
10  /
loop 1, abc def ghi
loop 2, abc def ghi
loop 3, abc def ghi
loop 4, abc def ghi
loop 5, abc def ghi
loop 6, abc def ghi
loop 7, abc def ghi
loop 8, abc def ghi
loop 9, abc def ghi
loop 10, abc def ghi

PL/SQL procedure successfully completed.

ops$tkyte@ORA817DEV.US.ORACLE.COM> select * from v$temporary_lobs;

SID CACHE_LOBS NOCACHE_LOBS
---------- ---------- ------------
        14          0            1

(不要使用sqlplus中的变量进行测试,sqlplus倾向于分配自己的lobs变量)

原文引自:
--------------------------------------------------------------------------------
[url]http://asktom.oracle.com/pls/ask/f?p=4950:14033939053232470511::NO::F4950_P8_DISPLAYID,F4950_P8_CRITERIA:1464712373163[/url]
--------------------------------------------------------------------------------
原文版权归属asktom.oracle.com所有,翻译 by millet•CNOUG
2005-12-29

Ask Tom之中英文对照20051228——PL/SQL函数返回CLOB类型值相关推荐

  1. PL/SQL -- 函数

    --================== -- PL/SQL --> 函数 --================== 函数通常用于返回特定的数据.其实质是一个有名字的PL/SQL块,作为一个sc ...

  2. 在SQL中使用PL/SQL函数存在的问题

    -----------------------------Cryking原创------------------------------ -----------------------转载请注明出处, ...

  3. oracle 12c pl/sql语言,ORACLE 12C SQL语句中通过with 定义PL/SQL 函数

    在ORACLE 12C支持在sql语句中编写函数,用来实现sql语句操作需要使用函数的部分功能,该功能对于你不想在数据库中新建函数 or 你的库是read only模式下要使用新函数实现某种功能,可以 ...

  4. oracle 11g函数包缓存,Oracle 11g 的PL/SQL函数结果缓存

    模仿Oracle性能诊断艺术中的例子做了两个试验,书上说如果不用RELIES_ON,则函数依赖的对象发生的变更操作就不会导致结果缓存的失效操作(result_cache RELIES_ON(test1 ...

  5. PL/SQL测试存在CLOB类型入参的存储过程时,入参为NULL

    今天有一存储过程调用时报错, 想dubeg下查找问题 . 但是由于一入参为CLOB类型(如果为VARCHAR2,只支持2000长度),利用PL/SQL自身的测试功能测试时,v_doc 填入参数在运行方 ...

  6. PL/SQL函数总结

    number数字类型函数 ABS(x) 函数,此函数用来返回一个数的绝对值. ACOS(x)函数,返回X的反余弦值.X范围从1到-1,输入值从0到派,以弧度为单位. ASIN(x)函数,返回X的反正弦 ...

  7. SQL/Oracle——第六章 PL/SQL函数(作业3)

    第6章:PL/SQL块 --6-19 beginp3(var_job=>'SALESMAN',i,j,k); end; /declarecursor cur_emp(var_job in var ...

  8. Linux命令之中英文对照

    列出目录内容 ls:list 改变目录 cd:change directory 移动 mv:move 复制 cp:copy 切换用户 su:switch user 红帽子打包管理器 rqm:redha ...

  9. oracle pl/sql 函数

    函数用于返回特定的数据,当建立函数时,在函数头部必须包含return子句.而在函数体内必须包含return语句返回的数据.我们可以使用create function来建立函数. 1).接下来通过一个案 ...

最新文章

  1. InterruptedException和中断线程的说明
  2. sp_decrypt
  3. mathematica在linux上运行,Mathematica在Ubuntu中的表现及修正
  4. ie11不识别html5影片,IE11无法显示flash?IE11无法播放视频的解决方法
  5. SSO单点登录学习总结(2)——基于Cookie+fliter单点登录实例
  6. 计算机课评课用语,【数学评课50条】_评课常用语50条
  7. EHIGH恒高:大话UWB技术之蓝牙定位的烦恼
  8. 最长上升子序列(LIS)题目合集
  9. CloudStack 4.4+KVM之CloudStack配置过程
  10. 计算机科学编辑部态度,计算机科学期刊介绍--各种杂志投稿方式与评价(转)...
  11. 潮汐计算php源码,潮汐选股公式
  12. 普通打印机,双面打印技巧
  13. curl:Failed connect to github-production-release-asset-2e65be.s3...; Connection refused解决办法
  14. 赵小楼《天道》《遥远的救世主》深度解析(122)好事、坏事是人性喜好认为,剥离好坏的认知你会更宽广
  15. ui设计参考网站以及ui设计参考书籍
  16. 轩辕实验室 | 车载网络入侵检测DCNN算法设计
  17. 红外小目标检测之DANNet
  18. Java 反射 C 反射调用 java 方法
  19. NBA球员常规赛信息selenium抓取
  20. 微信登陆信息不回调WXEntryActivity-onResp()

热门文章

  1. MySQL缓冲池-Buffer Pull
  2. 使用js-export-excel插件实现前端导出excel表格
  3. Android Studio Chipmunk | 2021.2.1 JNI
  4. 秒杀系统的设计与实现(一)
  5. php 扇面,扇面书法,四种章法让人赏心悦目
  6. 性能调优攻略——来自酷壳陈皓
  7. 欧文内容返回字符串php,欧文写的 phpcms代码执行过程
  8. 管理信息系统【三】之 管理信息系统技术基础
  9. 【VMware】ubuntu运行VMware kernel module updater
  10. html兴趣测试生成图表源码,用 Pytest+Allure 生成漂亮的 HTML 图形化测试报告