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

时间:2012-10-12 13:49:11

标签: 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;

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

我甚至尝试过直接分配

   report_clob := report 

获得相同的结果。

修改

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

报告和report_clob是程序中的变量。从C#代码调用此过程。

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

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

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

我很乐意提供更多细节。

4 个答案:

答案 0 :(得分:7)

引用(阅读here) -

  

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

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

report := CAST(report_clob AS VARCHAR2);

或者更好地将其用作CAST(report_clob AS VARCHAR2),而您尝试将BLOB用作VARCHAR

答案 1 :(得分:2)

将VARCHAR2转换为CLOB

在PL / SQL中,可以使用简单赋值,SUBSTR和其他方法将CLOB转换为VARCHAR2。只有当CLOB小于或等于VARCHAR2的大小时,简单赋值才有效。 PL / SQL中的限制为32767,SQL中限制为4000(尽管12c允许在SQL中使用32767)。

例如,此代码通过简单赋值转换小CLOB,然后转换较大CLOB的开头。

declare
    v_small_clob clob := lpad('0', 1000, '0');
    v_large_clob clob := lpad('0', 32767, '0') || lpad('0', 32767, '0');
    v_varchar2   varchar2(32767);
begin
    v_varchar2 := v_small_clob;
    v_varchar2 := substr(v_large_clob, 1, 32767);
end;

<强> LONG吗

以上代码不会将值转换为LONG。它只是看起来那样,因为PL / SQL调试器的限制和超过999个字符的字符串。

例如,在PL / SQL Developer中,打开一个Test窗口并添加并调试上面的代码。右键单击v_varchar2并选择“向手表添加变量”。单步执行代码,值将设置为“(长值)”。文本旁边有...,但不显示内容。 PLSQL Developer Long Value

<强> C#吗

我怀疑这里真正存在的问题是C#,但我不知道C#调试问题的能力有多大。

答案 2 :(得分:1)

ALTER TABLE TABLE_NAME ADD (COLUMN_NAME_NEW varchar2(4000 char));
update TABLE_NAME set COLUMN_NAME_NEW = COLUMN_NAME;

ALTER TABLE TABLE_NAME DROP COLUMN COLUMN_NAME;
ALTER TABLE TABLE_NAME rename column COLUMN_NAME_NEW to COLUMN_NAME;

答案 3 :(得分:0)

这是我的近似值:

  Declare 
  Variableclob Clob;
  Temp_Save Varchar2(32767); //whether it is greater than 4000

  Begin
  Select reportClob Into Temp_Save From Reporte Where Id=...;
  Variableclob:=To_Clob(Temp_Save);
  Dbms_Output.Put_Line(Variableclob);


  End;