Я использую Oracle 11g. Мои таблицы включают столбцы типа name и l_name (строчные буквы столбца имен). Я пытаюсь выполнить итерацию по всем столбцам в моем табличном пространстве, чтобы установить столбцы l_ в строчные буквы соответствующих столбцов верхнего регистра. Вот то, что я пробовал:Oracle: таблица обновлений с использованием динамических имен столбцов
for i in (select table_name from user_tables) loop
SELECT SUBSTR(column_name,3) bulk collect into my_temp_storage FROM user_tab_columns WHERE table_name = i.table_name and column_name like 'L\_%' escape '\';
for j in (select column_name from user_tab_columns where table_name = i.table_name) loop
for k in 1..my_temp_storage.count
loop
if(j.column_name like 'L\_%' escape '\' and SUBSTR(j.column_name,3) = my_temp_storage(k)) then
DBMS_OUTPUT.PUT_LINE('update ' || i.table_name || ' set ' || j.column_name || ' = LOWER(' ||my_temp_storage(k)|| ') where ' || j.column_name || ' is not null');
execute immediate 'update ' || i.table_name || ' set ' || j.column_name || ' = LOWER(' ||my_temp_storage(k)|| ') where ' || j.column_name || ' is not null';
end if;
end loop;
end loop;
end loop;
Я храню все имена столбцов в верхнем регистре в my_temp_storage и обновлении таблицы с меньшим значением столбцов в my_temp_storage. Это дало мне ошибку говоря:
Error report -
ORA-00900: invalid SQL statement
ORA-06512: at line 8
00900. 00000 - "invalid SQL statement"
*Cause:
*Action:
Но выход СУБД, казалось, хорошо:
`update EMPLOYEE set L_NAME = LOWER(NAME) where L_NAME is not null`
Не могли бы вы мне помочь с тем, как я сделал или любым другим способом, это может быть сделано?
Это единственное, что есть на моем рабочем листе, а строка 8 содержит оператор «выполнить немедленный» – rav
У вас нет 'begin' и' end' вокруг этого? И объявление для 'my_temp_storage'? –
Есть ли у вас таблицы или столбцы с зарезервированными словами или ключевыми словами и/или цитируемые идентификаторы? Что произойдет, если вы запустите это с немедленным комментированием execute? –