Oracle 如何使用游标更新表

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

如果今天日期介于表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_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_分行的样子。