Повторное использование вычисляемого столбца в обновлении в том же блоке кода - PullRequest
1 голос
/ 07 июня 2019

Я пытаюсь найти (лучший) способ обновления столбца таблицы на основе рассчитанного другого столбца. Прежде всего, я использую функцию для вычисления значения для столбца «BAS_CBR_EB_RWA», а затем я использую значение «BAS_CBR_EB_RWA» в качестве входных данных для вычисления столбца «BAS_CBR_EB_TOTAL_CAPITAL», как показано в приведенном ниже коде.

Не могли бы вы поделиться, как использовать его, чтобы сделать следующий расчет. замена 'BAS_CBR_EB_RWA' на правостороннее вычисление нежелательна, потому что у нас слишком много вычислений этого типа, и это может запутать других пользователей.

Заранее спасибо за помощь.

IF INSTTABLE = 16 THEN
  UPDATE LAO_DATA
    SET BAS_CBR_EB_RWA =  BAS2_RWA_CALC(BAS_CAPITAL_CALC_CD,
                                        CBR_CUR_BOOK_BAL,
                                        BAS_CAP_FACTOR_K,
                                        V_BASEL_MIN,
                                        V_BAS_RWA_RATE),
        BAS_CBR_EB_TOTAL_CAPITAL  = ROUND(BAS2_MGRL_CAPITAL(V_DATE, 
                                                            BAS_CBR_EB_RWA,
                                                            0),
                                          2),
    WHERE (AS_OF_DATE = V_DATE);

    --COMMIT;
END IF;

Ответы [ 2 ]

2 голосов
/ 07 июня 2019
Можно использовать оператор

A MERGE. Вы также можете заменить ROWID первичным ключом или уникальным ключом таблицы.

Поместите все свои первые уровни вычислений с вызовами функций внутри блока USING(), а второй уровень вычислений для RHS - в выражение SET

MERGE INTO lao_data t
USING (
           SELECT ROWID AS rid,bas2_rwa_calc(bas_capital_calc_cd,
                    cbr_cur_book_bal,
                    bas_cap_factor_k,
                    v_basel_min,v_bas_rwa_rate
           ) AS new_BAS_CBR_EB_RWA
           FROM lao_data
           WHERE as_of_date = V_DATE
      )
s ON ( s.rid = t.rowid )
WHEN MATCHED THEN UPDATE
SET t.bas_cbr_eb_rwa = s.new_BAS_CBR_EB_RWA 
    t.bas_cbr_eb_total_capital 
                     = round(bas2_mgrl_capital(v_date,s.nw_BAS_CBR_EB_RWA,0), 2) );
2 голосов
/ 07 июня 2019

В Oracle вы можете обновить подзапрос. Я не уверен на 100%, работает ли он для UDF, но вы можете попробовать:

UPDATE (SELECT LD.*,
               BAS2_RWA_CALC(BAS_CAPITAL_CALC_CD, CBR_CUR_BOOK_BAL, BAS_CAP_FACTOR_K, V_BASEL_MIN, V_BAS_RWA_RATE) as new_BAS_CBR_EB_RWA
        FROM LAO_DATA LD
       )
    SET BAS_CBR_EB_RWA = new_BAS_CBR_EB_RWA,
        BAS_CBR_EB_TOTAL_CAPITAL = ROUND(BAS2_MGRL_CAPITAL(V_DATE, nw_BAS_CBR_EB_RWA, 0), 2),
WHERE AS_OF_DATE = V_DATE;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...