ORA-22835: буфер слишком мал для преобразования CLOB в CHAR или BLOB в RAW (фактический: 4448, максимальный: 4000) - PullRequest
0 голосов
/ 14 декабря 2018

Я пытаюсь выполнить миграцию данных клиента, и эта ошибка произошла во время процедуры миграции.Я искал вокруг, и возможное решение состоит в том, чтобы обрезать или использовать DBMS_LOB.SUBSTR, но я не знаю, где их вставить. Это может быть эта часть (TO_CHAR(AIMSCMDDL_AT.BIOS_SEQ.nextval), но я все еще новичок в SQL и не уверен, что может бытьпричина проблемы.Кто-нибудь может подсказать мне, как решить эту проблему?Спасибо!

Update
       AIMSCMDDL_AT.AI_OPENNET_SVC_RPT
SET
       CUST_AGREEMENT_SIGNATURE = 
           CASE
                  WHEN TO_CHAR(CUST_AGREEMENT_SIGNATURE) = null
                        THEN null
                        ELSE 'NULL'
           END
     , CUST_DECLARATION_AUTH_ID = 
           CASE
                  WHEN CUST_DECLARATION_AUTH_ID = null
                        THEN null
                        ELSE 
                            CASE WHEN LENGTH(CUST_DECLARATION_AUTH_ID)<>9
                                THEN TO_CHAR(AIMSCMDDL_AT.BIOS_SEQ.nextval)
                                ELSE 
                                    CASE WHEN LENGTH(CUST_DECLARATION_AUTH_ID)=9
                                                and REGEXP_LIKE(substr(CUST_DECLARATION_AUTH_ID,1,1),'[A-Za-z]') 
                                                and REGEXP_LIKE(substr(CUST_DECLARATION_AUTH_ID,-1,1), '[A-Za-z]') 
                                                and  AIMSCMDDL_AT.is_number(substr(CUST_DECLARATION_AUTH_ID,2,7)) = 1                                       
                                         THEN substr(CUST_DECLARATION_AUTH_ID,1,1)||LPAD(TO_CHAR(AIMSCMDDL_AT.BIOS_SEQ.nextval),7,'0')||substr(CUST_DECLARATION_AUTH_ID,-1,1)
                                         ELSE TO_CHAR(AIMSCMDDL_AT.BIOS_SEQ.nextval)
                                    END
                            END         
            END
     , CUST_DECLARATION_AUTH_NM = 
           CASE
                  WHEN CUST_DECLARATION_AUTH_NM = null
                        THEN null
                        ELSE REGEXP_REPLACE(CUST_DECLARATION_AUTH_NM,'[[:alpha:]^[:digit:]^[:punct:]^]','*')
           END
     , CUSTOMER_SIGNATURE = 
           CASE
                  WHEN TO_CHAR(CUSTOMER_SIGNATURE) = null
                        THEN null
                        ELSE 'NULL'
           END
     , INSTALLER_NM = 
           CASE
                  WHEN INSTALLER_NM = null
                        THEN null
                        ELSE REGEXP_REPLACE(INSTALLER_NM,'[[:alpha:]^[:digit:]^[:punct:]^]','*')
           END
     , INSTALLER_SIGNATURE = 
           CASE
                  WHEN TO_CHAR(INSTALLER_SIGNATURE) = null
                        THEN null
                        ELSE 'NULL'
           END
     , REJ_CUSTOMER_ID = 
           CASE
                  WHEN REJ_CUSTOMER_ID = null
                        THEN null
                        ELSE 
                            CASE WHEN LENGTH(REJ_CUSTOMER_ID)<>9
                                THEN TO_CHAR(AIMSCMDDL_AT.BIOS_SEQ.nextval)
                                ELSE 
                                    CASE WHEN LENGTH(REJ_CUSTOMER_ID)=9
                                                and REGEXP_LIKE(substr(REJ_CUSTOMER_ID,1,1),'[A-Za-z]') 
                                                and REGEXP_LIKE(substr(REJ_CUSTOMER_ID,-1,1), '[A-Za-z]') 
                                                and  AIMSCMDDL_AT.is_number(substr(REJ_CUSTOMER_ID,2,7)) = 1                                        
                                         THEN substr(REJ_CUSTOMER_ID,1,1)||LPAD(TO_CHAR(AIMSCMDDL_AT.BIOS_SEQ.nextval),7,'0')||substr(REJ_CUSTOMER_ID,-1,1)
                                         ELSE TO_CHAR(AIMSCMDDL_AT.BIOS_SEQ.nextval)
                                    END
                            END         
            END
     , REJ_CUSTOMER_NM = 
           CASE
                  WHEN REJ_CUSTOMER_NM = null
                        THEN null
                        ELSE REGEXP_REPLACE(REJ_CUSTOMER_NM,'[[:alpha:]^[:digit:]^[:punct:]^]','*')
           END
     , REJ_CUSTOMER_SIGNATURE = 
           CASE
                  WHEN TO_CHAR(REJ_CUSTOMER_SIGNATURE) = null
                        THEN null
                        ELSE 'NULL'
           END
     , REJ_INSTALLER_NM = 
           CASE
                  WHEN REJ_INSTALLER_NM = null
                        THEN null
                        ELSE REGEXP_REPLACE(REJ_INSTALLER_NM,'[[:alpha:]^[:digit:]^[:punct:]^]','*')
           END
     , REJ_INSTALLER_SIGNATURE = 
           CASE
                  WHEN TO_CHAR(REJ_INSTALLER_SIGNATURE) = null
                        THEN null
                        ELSE 'NULL'
           END             
         ;

1 Ответ

0 голосов
/ 14 декабря 2018

Скорее всего, это происходит из одного из следующих выражений:

CASE
    WHEN TO_CHAR(INSTALLER_SIGNATURE) = null
    THEN null
    ELSE 'NULL'
END

Во-первых, они не работают.... = NULL никогда дает значение ИСТИНА.IS NULL вместо.Нет необходимости использовать TO_CHAR(), IS NULL работает для любого типа данных.

И вы можете записать его короче как

INSTALLER_SIGNATURE = NVL2(INSTALLER_SIGNATURE, 'NULL', NULL)

NB,

REGEXP_LIKE(substr(CUST_DECLARATION_AUTH_ID,1,1),'[A-Za-z]') 
and REGEXP_LIKE(substr(CUST_DECLARATION_AUTH_ID,-1,1), '[A-Za-z]') 

можно записать как

REGEXP_LIKE(CUST_DECLARATION_AUTH_ID,'^[A-Za-z].*[A-Za-z]$')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...