如何在oracle pl/sql中将CLOB转换为VARCHAR2

Mun*_*yal 10 oracle plsql clob

我有一个clob变量,需要将它分配给varchar2变量.clob var中的数据小于4000(i..e varchar2的maxsize)oracle10 +

我试过了

  report_len  := length(report_clob);
  report      := TO_CHAR(dbms_lob.substr(report_clob, report_len, 1 ));
  report_clob := null;
Run Code Online (Sandbox Code Playgroud)

但它会将报告转换为长值,我在调试时会看到它.当我从我的C#代码调用这个sql(proc)时.它抱怨说缓冲区太小,因为我按照varchar发送参数,但上面的转换可能会把它变成long值.

我甚至尝试过直接任务

   report_clob := report 
Run Code Online (Sandbox Code Playgroud)

获得相同的结果.

编辑

好的,要回答以下问题,请参阅:我在PL/SQL开发人员中使用测试脚本进行调试.报告变量是varchar2(4000).当我走后第二行.报告显示为一个很长的值,它只是说(长期价值).甚至看不到内容.

report和report_clob是程序中的变量.从C#代码调用此过程.

调用此过程时,C#中的异常字符串缓冲区太小.我已经在C#中给出了5000作为报告变量的大小,足以从过程中接收4000个最大字符值.所以我猜问题并不在于此.

当我分配report:='some string ....'时,C#call工作正常.

所以我的调查说报告:= transform(report_clob)正在使报告成为长值或某些这样的东西(怪异的)使得C#代码在5000 varchar out参数中处理更大的值时会出现问题.

我很乐意提供更多细节.

Ann*_*awn 8

引用(在这里阅读) -

使用CAST将CLOB值转换为字符数据类型或将BLOB值转换为RAW数据类型时,数据库会隐式将LOB值转换为字符数据或原始数据,然后将结果值显式转换为目标数据类型.

所以,这样的事情应该有效 -

report := CAST(report_clob AS VARCHAR2);
Run Code Online (Sandbox Code Playgroud)

或者更好地使用它作为CAST(report_clob AS VARCHAR2)你试图使用BLOBas的地方VARCHAR

  • 不幸的是,这不适用于 CLOB 数据很大的情况 - 我得到了异常 ORA-22835: Buffer toosmall for CLOB to CHAR...我最终将 CLOB 截断到 4000 个字符或更少,然后将截断的转换结果为 varchar - 通过使用此答案中的函数:/sf/answers/894477111/ (2认同)