Найти текстовые столбцы таблицы с размерностью BYTE, поменять размерность на CHAR и длину.
WITH COMMAND AS ( SELECT 'ALTER TABLE MY_TABLE MODIFY ('|| column_name ||' VARCHAR2(1000 CHAR));' C1 FROM all_tab_columns WHERE table_name LIKE '%MV_%' AND DATA_TYPE = 'VARCHAR2' AND OWNER = 'EXCHANGE' AND CHAR_USED = 'B')) SELECT C1 FROM COMMAND;
Получим текст операторов DDL, их выполнить в SQL*PLUS
Или PL/SQL: найти столбцы и выполнить операторы в динамическом SQL с EXECUTE IMMEDIATE
DECLARE CURSOR C1 IS ( SELECT owner, table_name, column_name, data_type, char_used FROM all_tab_columns WHERE table_name LIKE '%MV_%' AND DATA_TYPE = 'VARCHAR2' AND OWNER = 'EXCHANGE' AND CHAR_USED = 'B'); C VARCHAR2(4000); BEGIN DBMS_OUTPUT.ENABLE; DBMS_OUTPUT.ENABLE (buffer_size => null); FOR C IN C1 LOOP DBMS_OUTPUT.PUT_LINE('Command: EXECUTE IMMEDIATE' || 'ALTER TABLE ' || C.table_name || ' MODIFY '|| '(' || C.column_name || ' VARCHAR2(4000 CHAR)); '); EXECUTE IMMEDIATE 'ALTER TABLE ' || C.table_name || ' MODIFY ' || '(' || C.column_name || ' VARCHAR2(4000 CHAR))' ; DBMS_OUTPUT.PUT_LINE('Ok. Table ' || C.table_name || ' altered.'); END LOOP; END; /