我有一个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参数中处理更大的值时会出现问题。
我很乐意提供更多细节。
答案 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
并选择“向手表添加变量”。单步执行代码,值将设置为“(长值)”。文本旁边有...
,但不显示内容。
<强> 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;