在同一代码块中的更新中重用计算所得的列

时间:2019-06-06 21:08:57

标签: sql oracle

我试图根据计算出的另一列来找到(最佳)更新表列的方法。 首先,我使用函数来计算“ 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 个答案:

答案 0 :(得分:2)

在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;

答案 1 :(得分:2)

可以使用ROWID语句。您也可以将USING()替换为表的主键或唯一键。

在函数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) ); 表达式中输入RHS的第二级计算

{{1}}