17

我有一个 clob 变量,需要将它分配给 varchar2 变量。clob var 里面的数据小于 4000(即 varchar2 的 maxsize) oracle10+

我试过了

  report_len  := length(report_clob);
  report      := TO_CHAR(dbms_lob.substr(report_clob, report_len, 1 ));
  report_clob := null;

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

我什至尝试过直接分配

   report_clob := report 

得到相同的结果。

编辑

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

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

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

当我分配 report:= 'some string....' 然后 C# 调用工作正常。

因此,我的调查表明,report := transform (report_clob) 正在使报告变成长值或某些类似的东西(奇怪),这使得 C# 代码在处理 5000 varchar out 参数中的更大值时出现问题。

我很乐意提供更多细节。

4

4 回答 4

15

报价(在这里阅读)-

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

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

report := CAST(report_clob AS VARCHAR2(100));

或者更好的是,将它用作CAST(report_clob AS VARCHAR2(100))您尝试使用BLOBas的任何地方VARCHAR

于 2012-10-12T14:16:14.440 回答
4

将 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。由于 PL/SQL 调试器和长度超过 999 个字符的字符串的限制,它看起来只是这样。

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

C#?

我怀疑这里真正的问题出在 C# 上,但我不知道 C# 有多少可以调试问题。

于 2014-03-08T00:19:27.653 回答
3
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;
于 2015-11-03T13:54:55.900 回答
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;
于 2012-11-01T18:59:45.817 回答