Применить запрос Oracle к списку таблиц - PullRequest
0 голосов
/ 18 октября 2018

У меня есть список таблиц в экземпляре Oracle с пометкой «TableA_101818», «TableB_101818» и т. Д., И я хотел бы обновить все эти таблицы в одном запросе.Я знаю, что могу получить список таблиц, используя:

SELECT table_name FROM all_tables WHERE table_name LIKE 'Table%_101818'

, но я не уверен, как применить что-то вроде:

UPDATE (SELECT table_name FROM all_tables WHERE table_name LIKE 'Table%_101818) 
SET COL1 = 'something' WHERE col2 = 'something else'

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Если для всех таблиц обновленные строки идентичны, вы можете очень легко создать сценарий обновления, используя этот SQL.

select   
'UPDATE "'||TABLE_NAME||q'[" SET COL1 = 'something' WHERE col2 = 'something else';]' update_sql
from user_tables where table_name LIKE 'Table%_101818'; 

UPDATE "Table1_101818" SET COL1 = 'something' WHERE col2 = 'something else';
UPDATE "Table2_101818" SET COL1 = 'something' WHERE col2 = 'something else';

Просто скопируйте полученные строки в используемый вами инструмент SQL и запустите его.

* Обратите внимание, что в случае, если ваши имена таблиц находятся в смешанном регистре , вы должны заключить в кавычки в сгенерированном запросе.

Если вы хотите проверить значение предыдущих значений (перед обновлением), просто добавьте предикат в условии WHERE.

select   
'UPDATE "'||TABLE_NAME||q'[" SET COL1 = 'something' WHERE col2 = 'something else' and COL1 = 'previous value';]' update_sql
from user_tables where table_name LIKE 'Table%_101818';


UPDATE "Table1_101818" SET COL1 = 'something' WHERE col2 = 'something else' and COL1 = 'previous value';
UPDATE "Table2_101818" SET COL1 = 'something' WHERE col2 = 'something else' and COL1 = 'previous value';

В случае, если есть другое значение previos в COL1, вы увидите 0 records updatedи никакое изменение не будет выполнено.

Наиболее общий случай, когда обновляемые значения различаются для каждой таблицы.

Вы можете настроить вспомогательную таблицу, связывающуюся с именем таблицы и значениями, и используйтеэто в запросе, создающем операторы обновления:

TABLE_NAME                     COL1                           COL1_OLD                       COL2                         
------------------------------ ------------------------------ ------------------------------ ------------------------------
Table1_101818                  something                      previous value                 something else                 
Table2_101818                  z                              y                              x           

Запрос присоединяется к вспомогательной таблице и получает правильные значения для каждой таблицы

select   
'UPDATE "'||a.TABLE_NAME||'" SET COL1 = '''||b.col1||''' WHERE COL2 = '''||
    b.col2||''' and COL1 = '''||b.col1_old||''';' update_sql
from user_tables a
join update_values b on a.table_name = b.table_name
where a.table_name LIKE 'Table%_101818';

UPDATE "Table1_101818" SET COL1 = 'something' WHERE COL2 = 'something else' and COL1 = 'previous value';
UPDATE "Table2_101818" SET COL1 = 'z' WHERE COL2 = 'x' and COL1 = 'y';

Обратите внимание, что этот подход хорошо работает для ограниченногоколичество таблиц, обрабатываемых за один шаг.Если у вас есть тонны таблиц или задание является периодическим, вам может понадобиться подход динамический SQL , описанный в другом ответе.

0 голосов
/ 18 октября 2018

Вы можете использовать динамический SQL:

begin
  for r in (SELECT table_name FROM all_tables 
            WHERE table_name LIKE 'Table%_101818') 
  loop
    dbms_output.put_line('SELECT * FROM ' || r.table_name ||
                         q'{ WHERE col2 = 'something else';}');

    execute immediate 'UPDATE ' || r.table_name ||
                      q'{ SET COL1 = 'something' WHERE col2 = 'something else'}';
  end loop;
  commit;
end;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...