比较两个文本字段SQL-错误-ORA-22835:缓冲区太小,无法进行CLOB到CHAR或BLOB到RAW的转换
我在网络上看到过很多相同的错误,但似乎没有一个能解决我想做的事情。我想比较两个文本字段:PROBLEMCODE和DESCRIPTION。文本包含在CLOB和BLOB对象中,其中一些对象的大小约为24000字节(字符?),这会引发错误:比较两个文本字段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) 我完全理解这个错误的根本原因,但是我不知道如何通过比较文本字
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语句;您正在运行的代码(您当前的代码将不会运行,因为它缺少逗号,在语法上是无效的,并且由于您在同一列上过滤了两次,所以没有意义);以及您的预期输出。