【问题标题】:How to convert CLOB to VARCHAR2 inside oracle pl/sql如何在 oracle pl/sql 中将 CLOB 转换为 VARCHAR2
【发布时间】:2012-10-03 08:31:30
【问题描述】:

我有一个 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 参数中的更大值时出现问题。

我很乐意提供更多细节。

【问题讨论】:

  • report 是如何声明的? LONG 还是 VARCHAR2?你是如何调试的,你是如何将值返回到c# - 函数返回或输出参数,那是什么类型?
  • report := CAST(report_clob AS VARCHAR2(3999));
  • DBMS_LOB.substr 返回一个 VARCHAR2,你不需要 TO_CHAR 函数。还有什么叫长值?你如何调试?您到底得到了什么消息错误(即 Oracle 或 C#)?报表变量是如何声明的?
  • 请在我的问题编辑区查看更新

标签: oracle plsql clob


【解决方案1】:

引用(阅读here)-

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

所以,这样的事情应该可以工作-

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

或者最好将它用作CAST(report_clob AS VARCHAR2(100)),无论您何时尝试将BLOB用作VARCHAR

【讨论】:

  • 在选择中使用CAST(...) 时,您需要指定大小,例如VARCHAR2(20)
  • 没错,@Wassadamo。我挣扎了很久才意识到。
【解决方案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。由于 PL/SQL 调试器和长度超过 999 个字符的字符串的限制,它看起来只是这样。

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

C#?

我怀疑这里真正的问题在于 C#,但我不知道 C# 是否足以调试问题。

【讨论】:

    【解决方案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;
    

    【讨论】:

      【解决方案4】:

      这是我的近似值:

        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;
      

      【讨论】:

      • 有一个人把-1放在所有的地方。
      猜你喜欢
      • 2015-12-13
      • 2011-02-11
      • 2014-08-24
      • 1970-01-01
      • 2021-06-16
      • 1970-01-01
      • 2013-04-27
      • 2012-11-04
      • 2017-01-17
      相关资源
      最近更新 更多