Как обновить таблицу с помощью курсора - PullRequest
0 голосов
/ 27 мая 2020

Мне нужно написать процедуру для обновления столбца таблицы Xyz, если сегодняшняя дата находится между start_date и end_date таблицы AB C.

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

, когда я запускаю процедуру сегодня и если сегодняшняя дата находится между датой начала и датой окончания таблицы AB C, тогда процедура обновит столбец 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;   

1 Ответ

1 голос
/ 27 мая 2020

Вот один из вариантов: merge. (Сегодня 27.05.2020, что находится между начальной и конечной датами, хранящимися в таблице 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>

Итог: вам не нужна ни процедура, ни oop (что неэффективно), так как все можно сделать с помощью одного оператора 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;
/
...