我对以前有人写过的更新代码块有一点疑问,现在我将在我的Java程序中使用它。
Is it possible to update a column first, then commit and afterwards use same column as an input in another update statement inside same block, as listed in below code.
,我知道使用子查询的方式来做这件事,但从来没有见过这样的方式。如果有人能确认
1)是否正确?
2),如果不是,可以更新哪些内容使其不再使用子查询格式。
3),bas_capital_calc_cd也是正在更新的表derivatives
中的列。我们能否将列作为输入传递给函数,比如这里的bas2_rwa_calc
?此外,我们可以在plsql函数中传递列名作为输入。
提前感谢您的帮助!
--BAS_EB_RWA_COMMT is being used in BAS_EB_TOTAL_CAPITAL calculation. similarly, BAS_AB_RWA_COMMT is being used in BAS_AB_TOTAL_CAPITAL calculation.
IF ID = 17 THEN
UPDATE derivatives
SET BAS_CAPITAL_CALC_CD = 'T',
BAS_CATEGORY_CD = case when nvl(rec.ssfa_resecure_flag,'N') = 'Y' then 911 else 910 end,
BAS_EB_RWA_COMMT = bas2_rwa_calc(bas_capital_calc_cd, v_SSFA_COMMT_AMT,v_BAS_CAP_FACTOR_K_COMMT, v_basel_min,v_bas_rwa_rate) + NVL(BAS_CVA_PORTFOLIO_RWA,0),
BAS_AB_RWA_COMMT = bas2_rwa_calc(bas_capital_calc_cd, v_SSFA_COMMT_AMT,V_BAS_CAP_FACTOR_K_COMMT, v_basel_min,v_bas_rwa_rate) + NVL(BAS_CVA_PORTFOLIO_RWA,0),
BAS_ICAAP_EB_RWA_COMMT = bas2_rwa_calc(bas_capital_calc_cd,bas_unused_commt,bas_icaap_factor_k_commt,v_basel_min,v_bas_rwa_rate),
WHERE AS_OF_DATE = v_currect_DATE
COMMIT;
UPDATE derivatives
SET BAS_EB_TOTAL_CAPITAL = round(BAS2_MGRL_CAPITAL(v_date, BAS_EB_RWA, BAS_EB_RWA_COMMT),2),
BAS_AB_TOTAL_CAPITAL = round(BAS2_MGRL_CAPITAL(v_date, BAS_AB_RWA, BAS_AB_RWA_COMMT),2)
WHERE AS_OF_DATE = v_DATE
AND ID_NUMBER = rec.ID_NUMBER
AND IDENTITY_CODE = rec.IDENTITY_CODE;
COMMIT;
WHERE AS_OF_DATE = v_currect_DATE;
COMMIT;
END IF
发布于 2019-07-23 18:04:26
在DB2和SQL标准中,您可以使用一个名为FINAL_TABLE的特性来完成此操作。在Oracle中,您使用一个名为“返回”的语句。
发布于 2019-07-23 18:05:53
正如我从您的问题陈述中了解到的,您需要理解PLSQL
。希望我做得对。
为了理解这个概念,让我们首先讨论什么是PL/SQL?
资料来源:https://www.geeksforgeeks.org/plsql-introduction/
PL/SQL是一种块结构语言,它使开发人员能够将SQL的强大功能与过程statements.All结合起来,同时将块的语句传递给oracle引擎,从而提高了处理速度,减少了通信量。
SQL:的缺点:
SQL不为程序员提供条件检查、循环和分支技术。
SQL语句一次一个地传递给Oracle引擎,这增加了通信量,降低了速度。
SQL没有在数据操作期间进行错误检查的功能。
PL/SQL的特性:
PL/SQL基本上是一种过程语言,它提供了决策、迭代和过程编程语言的许多功能。
PL/SQL可以使用单个命令在一个块中执行多个查询。
您可以创建一个PL/SQL单元,例如过程、函数、包、触发器和类型,它们存储在数据库中供应用程序重用。
PL/SQL提供了一个特性来处理PL/SQL块中出现的异常,称为异常处理块。
用PL/SQL编写的应用程序可移植到计算机硬件或操作系统,其中Oracle是可操作的。
PL/SQL提供了广泛的错误检查。
现在,请检查突出显示的点PL/SQL可以使用单个命令在一个块中执行多个查询。
让我们以你所描述的情况为例。
create table test as select 0 as col1, 0 as col2 from dual;
declare
v_col1 test.col1%type;
v_col2 test.col2%type;
begin
update test set col1 = col1 + 1;
commit;
dbms_output.put_line('col1='+v_col1);
dbms_output.put_line('col2='+v_col2);
update test set col2 = col1 + 1;
commit;
dbms_output.put_line('col1='+v_col1);
dbms_output.put_line('col2='+v_col2);
end;
请运行以上代码,这只是一个简单的例子,你的问题。
和点1: (将Oracle视为示例数据库),因此,据我所知,您编写这两个更新的方式是可能的,但我不确定这是否是处理此类情况的最佳方法或唯一方法。
和要点3:您可以使用动态SQL在Oracle中实现相同的目标。
https://stackoverflow.com/questions/57169633
复制相似问题