首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用两个更新,其中第二个update语句使用来自第一个update语句的列作为输入。

使用两个更新,其中第二个update语句使用来自第一个update语句的列作为输入。
EN

Stack Overflow用户
提问于 2019-07-23 17:46:33
回答 2查看 67关注 0票数 0

我对以前有人写过的更新代码块有一点疑问,现在我将在我的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函数中传递列名作为输入。

提前感谢您的帮助!

代码语言:javascript
运行
复制
--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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-23 18:04:26

在DB2和SQL标准中,您可以使用一个名为FINAL_TABLE的特性来完成此操作。在Oracle中,您使用一个名为“返回”的语句。

cf - https://blog.jooq.org/tag/final-table/

票数 1
EN

Stack Overflow用户

发布于 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可以使用单个命令在一个块中执行多个查询。

让我们以你所描述的情况为例。

代码语言:javascript
运行
复制
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中实现相同的目标。

参考链接: 01/appdev.920/a96590/adg09dyn.htm

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57169633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档