0

Я использую 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` 

Не могли бы вы мне помочь с тем, как я сделал или любым другим способом, это может быть сделано?

+0

Это единственное, что есть на моем рабочем листе, а строка 8 содержит оператор «выполнить немедленный» – rav

+0

У вас нет 'begin' и' end' вокруг этого? И объявление для 'my_temp_storage'? –

+0

Есть ли у вас таблицы или столбцы с зарезервированными словами или ключевыми словами и/или цитируемые идентификаторы? Что произойдет, если вы запустите это с немедленным комментированием execute? –

ответ

1

Программа, безусловно, может быть упрощена:

begin 
    for i in (select table_name, column_name from user_tab_columns 
       where column_name like 'L\_%' escape '\') 
    loop 
     l_sql := 'update ' || i.table_name || ' set ' || i.column_name 
        || ' = LOWER(' ||substr(i.columm_name,3) 
        || ') where ' || i.column_name || ' is not null'; 
     execute immediate l_sql; 
    end loop;   
end; 

Это кажется странным дизайн базы данных, хотя. Вы считали виртуальные столбцы и/или функциональные индексы вместо ручных столбцов?

+0

Сначала я попробовал что-то подобное. Но LOWER ('|| substr (i.columm_name, 3)) возвращает вспомогательную строку из того же столбца (то есть столбца L_). – rav

+0

Это подстрока ** имя ** столбца не его значение, так что это не имеет значения? –

+0

Это работает. Огромное спасибо. Способ, которым я пытался раньше: LOWER (substr ('|| i.columm_name ||', 3), который фактически дал строчные значения одного столбца – rav

Смежные вопросы