Найти текстовые столбцы таблицы с размерностью 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;
/
