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

Sql 使用两个更新,其中第二个update语句使用第一个update语句中的列作为输入,sql,plsql,Sql,Plsql,我对以前有人编写的更新代码块有点怀疑,现在我将在Java程序中使用它 是否可以先更新一个列,然后提交,然后在同一块中的另一个update语句中使用同一列作为输入,如下面的代码所示。我知道使用子查询方式来完成此操作,但以前从未见过这种方式。如果有人能证实,那就太好了 1)是否正确 2)如果没有,除了使用子查询格式,还可以更新哪些内容以使其正常工作 3)此外,bas_capital_calc_cd列在正在更新的同一张表衍生品中。我们是否可以将列作为输入传递给函数,例如这里的bas2\u rwa\u

我对以前有人编写的更新代码块有点怀疑,现在我将在Java程序中使用它

是否可以先更新一个列,然后提交,然后在同一块中的另一个update语句中使用同一列作为输入,如下面的代码所示。
我知道使用子查询方式来完成此操作,但以前从未见过这种方式。如果有人能证实,那就太好了

1)是否正确

2)如果没有,除了使用子查询格式,还可以更新哪些内容以使其正常工作

3)此外,bas_capital_calc_cd列在正在更新的同一张表
衍生品中。我们是否可以将列作为输入传递给函数,例如这里的
bas2\u rwa\u 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

在DB2和SQL标准中,可以使用名为FINAL_TABLE的特性来实现这一点。在Oracle中,使用名为“RETURNING”的语句


cf-

在DB2和SQL标准中,您可以使用一个名为FINAL_TABLE的特性来实现这一点。在Oracle中,使用名为“RETURNING”的语句


cf-

正如我从您的问题陈述中了解到的,您需要理解
PLSQL
。希望,我做对了

为了理解这个概念,让我们首先讨论什么是PL/SQL

理论来源:

PL/SQL是一种块结构语言,它使开发人员能够将SQL的功能与过程语句结合起来。一个块的所有语句都一次传递给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视为示例数据库)因此,据我所知,是的,这是可能的,但是,您编写这两个更新的方式,我不确定这是否是处理此类情况的最佳方式或唯一方式

Ans第3点:您可以使用动态SQL在Oracle中实现同样的功能


参考链接:

正如我从您的问题陈述中了解到的,您需要理解
PLSQL
。希望,我做对了

为了理解这个概念,让我们首先讨论什么是PL/SQL

理论来源:

PL/SQL是一种块结构语言,它使开发人员能够将SQL的功能与过程语句结合起来。一个块的所有语句都一次传递给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视为示例数据库)因此,据我所知,是的,这是可能的,但是,您编写这两个更新的方式,我不确定这是否是处理此类情况的最佳方式或唯一方式

Ans第3点:您可以使用动态SQL在Oracle中实现同样的功能

参考链接: