比较两个文本字段SQL-错误-ORA-22835:缓冲区太小,无法进行CLOB到CHAR或BLOB到RAW的转换

比较两个文本字段SQL-错误-ORA-22835:缓冲区太小,无法进行CLOB到CHAR或BLOB到RAW的转换,sql,oracle,toad,Sql,Oracle,Toad,我在网络上看到过很多相同的错误,但似乎没有一个能解决我想做的事情。我想比较两个文本字段:PROBLEMCODE和DESCRIPTION。文本包含在CLOB和BLOB对象中,其中一些对象的大小约为24000字节(字符?),这会引发错误: ORA-22835: Buffer too small for CLOB to CHAR or BLOB to RAW conversion (actual: 4029, maximum: 4000) 我完全理解这个错误的根本原因,但是我不知道如何通过比较文本字

我在网络上看到过很多相同的错误,但似乎没有一个能解决我想做的事情。我想比较两个文本字段:PROBLEMCODE和DESCRIPTION。文本包含在CLOB和BLOB对象中,其中一些对象的大小约为24000字节(字符?),这会引发错误:

ORA-22835: Buffer too small for CLOB to CHAR or BLOB to RAW conversion (actual: 4029, maximum: 4000)
我完全理解这个错误的根本原因,但是我不知道如何通过比较文本字段来解决这个问题。我想检查文本问题代码和描述是否相同。如果它们相同,请使用“说明”行。示例查询和示例输出:

SELECT TICKET, TEXT, TYPE

FROM TABLE

WHERE (TYPE = 'DESCRIPTION' 
        OR TYPE= 'PROBLEM')  
输出:

TICKET    TEXT    TYPE
123       CLOB    PROBLEM
123       CLOB    DESCRIPTION
111       BLOB    PROBLEM
Connected.
SQL> SQL>
Table dropped.

SQL>
Table dropped.

SQL> SQL>
Table created.

SQL> SQL>   2
1 row created.

SQL>   2
1 row created.

SQL>   2
1 row created.

SQL> SQL>   2    3    4    5    6    7    8    9   10   11   12   13   14
PL/SQL procedure successfully completed.

SQL> SQL>
Table created.

SQL> SQL> SQL> SQL> ERROR:
ORA-22835: Buffer too small for CLOB to CHAR or BLOB to RAW conversion (actual:
8080, maximum: 4000)



no rows selected

SQL> SQL> SQL> SQL>
      COL1
----------
COL2
--------------------------------------------------------------------------------
      COL1
----------
COL2
--------------------------------------------------------------------------------
         1
aaaaaaaaa
         1
aaaaaaaaa


      COL1
----------
COL2
--------------------------------------------------------------------------------
      COL1
----------
COL2
--------------------------------------------------------------------------------
         2
bbbbbbbbb
         2
bbbbbbbbb


      COL1
----------
COL2
--------------------------------------------------------------------------------
      COL1
----------
COL2
--------------------------------------------------------------------------------
         3
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
         3
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
现在,我想说下面这样的话,我想我已经在下面的完整查询中完成了,但是我不确定,因为我无法测试,因为我一直得到缓冲区错误

IF TICKET PROBLEM TEXT == TICKET DESCRIPTION TEXT:
    FILTER OUT PROBLEM ROW 
    USE DESCRIPTION ROW
所以,下面是我的完整查询和单票过滤,我很确定,但不是100%正确过滤。我的问题是:如何调整以补偿缓冲区错误?如何比较和过滤SQL/TOAD/Oracle中的大型文本字段

LDOWNERCOL=类型

SELECT 
       *   
FROM (SELECT 
        TICKETID, LDTEXT, LDOWNERCOL
            DENSE_RANK() OVER (PARTITION BY TICKETID ORDER BY TO_CHAR(LDTEXT))  AS Duplicated
        FROM
            MAXIMO.LONGDESCRIPTION INNER JOIN MAXIMO.PLUSCA ON LDKEY = TICKETUID
        WHERE LDOWNERCOL IN ('DESCRIPTION', 'PROBLEMCODE')
            AND (LDOWNERCOL = 'DESCRIPTION' 
                OR LDOWNERCOL = 'PROBLEMCODE'
                OR LDOWNERCOL = 'TYPE1CODE'
                OR LDOWNERCOL = 'TYPE2CODE')
 )   
WHERE   
    Duplicated = 1
当我运行这个程序时,它会将错误从
抛出到\u CHAR(LDTEXT)
,但是如果我添加follow以过滤掉大的文本字段,它就会工作。我该如何补偿呢

WHERE LDOWNERCOL IN ('DESCRIPTION', 'PROBLEMCODE')
            AND (DBMS_LOB.GETLENGTH(LDTEXT) < 2000)
其中LDOWNERCOL位于('DESCRIPTION','PROBLEMCODE')
和(DBMS_LOB.GETLENGTH(LDTEXT)<2000)

如果比较CLOB,则需要使用DBMS\u LOB.compare(),因为to\u CHAR()将CLOB转换为varchar2。由于Varchar2的长度有限,所以当CLOB的长度超过Varchar2的最大长度时,无法转换CLOB隐式。请看我下面的例子。当CLOB的长度小于等于2000个字符时,First Select使用TO_CHAR(),否则将引发ORA-22835。在second Select DBMS_LOB.COMPARE()中使用

输出:

TICKET    TEXT    TYPE
123       CLOB    PROBLEM
123       CLOB    DESCRIPTION
111       BLOB    PROBLEM
Connected.
SQL> SQL>
Table dropped.

SQL>
Table dropped.

SQL> SQL>
Table created.

SQL> SQL>   2
1 row created.

SQL>   2
1 row created.

SQL>   2
1 row created.

SQL> SQL>   2    3    4    5    6    7    8    9   10   11   12   13   14
PL/SQL procedure successfully completed.

SQL> SQL>
Table created.

SQL> SQL> SQL> SQL> ERROR:
ORA-22835: Buffer too small for CLOB to CHAR or BLOB to RAW conversion (actual:
8080, maximum: 4000)



no rows selected

SQL> SQL> SQL> SQL>
      COL1
----------
COL2
--------------------------------------------------------------------------------
      COL1
----------
COL2
--------------------------------------------------------------------------------
         1
aaaaaaaaa
         1
aaaaaaaaa


      COL1
----------
COL2
--------------------------------------------------------------------------------
      COL1
----------
COL2
--------------------------------------------------------------------------------
         2
bbbbbbbbb
         2
bbbbbbbbb


      COL1
----------
COL2
--------------------------------------------------------------------------------
      COL1
----------
COL2
--------------------------------------------------------------------------------
         3
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
         3
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

您是否考虑散列<代码> LDTEX专栏,即?请用您的表中的包括:DDL语句(文本列既存储代码< Culb 和<代码> BLB< <代码>类型>)来询问您的问题;一些样本数据的DML语句;您正在运行的代码(您当前的代码将不会运行,因为它缺少逗号,在语法上是无效的,并且由于您在同一列上过滤了两次,所以没有意义);以及您的预期输出。