Обходной путь для oreplace в Teradata, превышающий лимит

#sql #database #teradata #data-warehouse #teradatasql

#sql #База данных #teradata #хранилище данных #teradatasql

Вопрос:

Я пытаюсь обновить таблицу с помощью oreplace, но она не позволяет мне сделать это, говоря, что она превышает длину. Я попытался разбить его на несколько операторов oreplace в первом подходе и несколько операторов update в качестве второго подхода, но он по-прежнему не работает и не дает мне желаемых результатов.

По-видимому, oreplace может возвращать не более 8000 символов? Если да, то каково решение / обходной путь для этого?

Первый подход:

 sel
oreplace (substr(text_val,1,8000),'CIM_OUTPUT','DD_CIM_OUTPUT')
|| oreplace (substr(text_val,8001,16000),'CIM_OUTPUT','DD_CIM_OUTPUT')
|| oreplace (substr(text_val,16001,18000),'CIM_OUTPUT','DD_CIM_OUTPUT')
from DB.TABLENAME ;
 

Второй подход:

Проблема заключается в том, что text_val усекается после первого обновления, а остальные обновления не применяются к полному значению text_Val, что делает их полезными.

 update DB.TABLENAME set text_val = oreplace (substr(text_val,1,8000),'CIM_OUTPUT','DD_CIM_OUTPUT');

update DB.TABLENAME set text_val = text_val||oreplace (substr(text_val,8001,16000),'CIM_OUTPUT','DD_CIM_OUTPUT');

update DB.TABLENAME set text_val = text_val || oreplace (substr(text_val,16001,18000),'CIM_OUTPUT','DD_CIM_OUTPUT');
 

Ответ №1:

oReplace ограничен 8000 символами (возможно, потому, что он основан на Oracle). REGEXP_REPLACE имеет тот же предел для ввода VarChar, но работает и с CLOBS. Это должно сработать:

 SET TEXT_VAL=cast(regexp_replace(cast(text_Val as CLOB),'cim_output','DD_cim_ouput') as varchar(18000));