Dynami c sql - обновить несколько строк с помощью цикла - PullRequest
0 голосов
/ 30 апреля 2020

У нас есть много таблиц, которые содержат 3 столбца (RID, PARTNER, SUPPLIER). Я хочу обновить эти столбцы, но только в 4 таблицах - зависит от ПК.

, поэтому я что-то начал, но застрял:

BEGIN
 FOR i IN
  (select table_name from all_tab_columns where column_name = 'RID' /*PK*/ 
   and column_name = 'PARTNER' or column_name = 'SUPPLIER')
 LOOP
  EXECUTE IMMEDIATE 'UPDATE  ' || i.table_name|| 'set PARTNER = :newvalue where PARTNER = :oldavalue and RID = :ridvalue'
  USING (newvalue, oldvalue, ridvalue)
END LOOP 
END

Проблемы:

  1. Не знаю, как мне обновить несколько cols с этим методом (потому что в таблицах существует Partner или Supplier, например: в одной таблице это Partner, в другой таблице это Supplier)
  2. Я хочу обновить только (Partner или Supplier), но только в 1 таблице, зависит от PK
  3. Это работоспособное решение?

1 Ответ

1 голос
/ 30 апреля 2020

Вам необходимо использовать условное предложение USING и немного другой запрос в FOR l oop следующим образом:

BEGIN
    FOR I IN (
        SELECT TABLE_NAME
               , PARTNER_COUNT
               , SUPPLIER_COUNT
        FROM (
            SELECT TABLE_NAME
                   , SUM(CASE WHEN COLUMN_NAME = 'RID' THEN 1 ELSE 0 END) AS RID_COUNT
                   , SUM(CASE WHEN COLUMN_NAME = 'PARTNER' THEN 1 ELSE 0 END) AS PARTNER_COUNT
                   , SUM(CASE WHEN COLUMN_NAME = 'SUPPLIER' THEN 1  ELSE 0 END) AS SUPPLIER_COUNT
            FROM ALL_TAB_COLUMNS
            WHERE COLUMN_NAME = 'RID'
                  OR COLUMN_NAME = 'PARTNER'
                  OR COLUMN_NAME = 'SUPPLIER'
        ) WHERE RID_COUNT = 1 AND PARTNER_COUNT + SUPPLIER_COUNT = 1
    ) LOOP
        EXECUTE IMMEDIATE 'UPDATE  '
                          || I.TABLE_NAME
                          || 'set :col_name = :newvalue where :col_name = :oldavalue and RID = :ridvalue'
            USING ( DECODE(PARTNER_COUNT,1,'PARTNER','SUPPLIER'),
                    NEWVALUE, 
                    DECODE(PARTNER_COUNT,1,'PARTNER','SUPPLIER'),
                    OLDVALUE, 
                    RIDVALUE );
    END LOOP;
END;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...