#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));