Oracle 如何使用游标更新表
如果今天日期介于表ABC的开始日期和结束日期之间,我需要编写一个过程来更新表Xyz的一列Oracle 如何使用游标更新表,oracle,plsql,Oracle,Plsql,如果今天日期介于表ABC的开始日期和结束日期之间,我需要编写一个过程来更新表Xyz的一列 table ABC fin_cycle start_date end_date account_class ---------------------------------------------------- F2018 27-05-2020 29-05-20 2003 table xyz account_no account
table ABC
fin_cycle start_date end_date account_class
----------------------------------------------------
F2018 27-05-2020 29-05-20 2003
table xyz
account_no account_class ac_no_dr
1234 2003 Y
当我今天运行该过程时,如果今天的日期介于表ABC的开始日期和结束日期之间,则该过程将更新列ac_no_dr为Y,否则将更新列为N。我已准备好此框架
Create Or Replace PROCEDURE pr_no_debit
Cursor c_Today(start_date, end_Date) is
Select Today from sttm_branch where today between start_Date and end_Date;
l_No_Debit_List ABC%ROW_TYPE;
Begin
For c_Today(l_No_Debit_List.start_Date,l_No_Debit_List.end_Date) Loop
Update XYZ set ac_no_DR='Y' where account_class=l_No_Debit_List.account_class;
End Loop;
-- At the end of the period Change No_Debit to 'N'
End pr_no_debit;
这里有一个选项:合并。今天是2020年5月27日,介于abc表中存储的开始日期和结束日期之间
样本数据:
SQL> select * From abc;
FIN_C START_DATE END_DATE ACCOUNT_CLASS
----- ---------- ---------- -------------
F2018 27.05.2020 29.05.2020 2003
SQL> select * From xyz;
ACCOUNT_NO ACCOUNT_CLASS A
---------- ------------- -
1234 2003
合并语句:
SQL> merge into xyz a
2 using (select account_class,
3 case when sysdate between start_date and end_date then 'Y'
4 else 'N'
5 end ac_no_dr
6 from abc
7 ) x
8 on (a.account_class = x.account_class)
9 when matched then update set a.ac_no_dr = x.ac_no_dr;
1 row merged.
结果:
SQL> select * From xyz;
ACCOUNT_NO ACCOUNT_CLASS A
---------- ------------- -
1234 2003 Y
SQL>
一句话:你不需要一个过程也不需要一个低效率的循环,因为任何事情都可以用一条SQL语句来完成
如果-正如您所评论的-必须是一个过程,那么也没有问题:
create or replace procedure p_merge as
begin
merge into xyz a
using (select account_class,
case when sysdate between start_date and end_date then 'Y'
else 'N'
end ac_no_dr
from abc
) x
on (a.account_class = x.account_class)
when matched then update set a.ac_no_dr = x.ac_no_dr;
end;
/
这个代码毫无意义。l\u No\u Debit\u列表没有值。那么我如何编写此过程。。请帮助..更新XYZ x set ac_no_DR='Y',其中从ABC a中选择count*,其中a.account_class=x.account_class=x.account_class和truncsysdate介于a.start_date和a.end_date>0之间。我需要一个过程,因为我们需要通过一个调度程序运行此过程,它将在每次EOD后自动运行。好的,没有问题。如果你不知道如何用某个语句生成一个过程,我是为你做的-请看一看。我不能使用sysdate,在我们应用程序中的每个eod之后,日期都会在一个表中得到更新,即sttm_分支。。我们需要从这个表中获取今天的日期。所以不要使用SYSDATE,而是使用从表中获取的日期。有什么问题吗?我不知道STTM_分行的样子。