Как сохранить количество затронутых записей и вернуть его в качестве параметра? - PullRequest
0 голосов
/ 15 мая 2018

У меня есть параметр in (set = 0), чтобы отслеживать количество записей, которые я буду изменять. Я пытаюсь объединить данные в таблицу с именем Table1, записи, которые были обновлены в другой таблице (Table2) с момента последнего обновления Table1. Условный оператор сравнивает столбец Table1.LastUpdate со столбцом max (Modified_date ) из Table2 и вставляет только те записи, в которых table1.last_update * Столбец 1008 * больше столбца table2.max (updated_date) . Тогда мне нужно будет сохранить это число и вернуть его как выходной параметр. Вот что у меня есть:

create or replace procedure test_proc (rUpdated_Row_Count IN NUMBER, rUpdated_Row_Count_2 OUT NUMBER) is
CURSOR c1 is
            select max(modified_date) as max_modified_date
              from table1;
        l_var c1%ROWTYPE;
-----------
CURSOR c2 is
            select table2_id
                 , last_update
              from table2;
         k_var c2%ROWTYPE;
BEGIN
LOOP
Open c1;
        Fetch c1 into l_var;
Open c2;
        Fetch c2 into k_var;
EXIT WHEN c1%NOTFOUND;
IF k_var.last_update > l_var.max_modified_date THEN 
Insert into table2(table2_id, last_update)
            values(null, k_var.last_update);
            commit;
      rUpdated_Row_Count_2 := rUpdated_Row_Count + 1;
END IF;
END LOOP;
Close c1;
Close c2;
END test_proc;

Заранее спасибо!

Изменен мой код (после дальнейших исследований):

create or replace procedure test_proc (rUpdated_Row_Count IN NUMBER, rUpdated_Row_Count_2 OUT NUMBER) is
CURSOR c1 is
            select max(modified_date) as max_modified_date
              from table1;
        l_var c1%ROWTYPE;
-----------
CURSOR c2 is
            select table2_id
                 , last_update
              from table2;
         k_var c2%ROWTYPE;
BEGIN
Open c1;
Open c2;
LOOP
        Fetch c1 into l_var;
        Fetch c2 into k_var;
EXIT WHEN c2%NOTFOUND;
IF k_var.last_update > l_var.max_modified_date THEN 
Insert into table2(table2_id, last_update)
            values(null, k_var.last_update);
            commit;
      rUpdated_Row_Count_2 := rUpdated_Row_Count + 1;
END IF;
END LOOP;
Close c1;
Close c2;
END test_proc;

Воспроизводимые данные / код ниже:

Create table1
(
  table1_id number,
  modified_date date
 );

Create table2
(
  table2_id number,
  last_update date
);

insert into table1(table1_id, modified_date) values(1, sysdate);
insert into table1(table1_id, modified_date) values(2, sysdate);
insert into table1(table1_id, modified_date) values(3, sysdate -1);
insert into table2(table2_id, last_update) values(1, sysdate + 1);
insert into table2(table2_id, last_update) values(2, sysdate + 2);

1 Ответ

0 голосов
/ 15 мая 2018

Не совсем уверен, для чего предназначен параметр «IN». Также не совсем уверен в общем обосновании. Однако вот как я написал бы первую версию вашей процедуры:

create or replace procedure test_proc2 (
  rUpdated_Row_Count IN NUMBER
, rUpdated_Row_Count_2 IN OUT NUMBER ) 
is
  max_modified_date date ;
begin
  select max( modified_date ) into max_modified_date from table1 ;  

  for rec_ in ( 
     select table2_id, last_update
     from table2
  ) loop
      if rec_.last_update > max_modified_date then 
        insert into table2( table2_id, last_update )
          values( null, rec_.last_update ) ;
        rUpdated_Row_Count_2 := rUpdated_Row_Count_2 + 1 ;
      end if ;
  end loop;
end ;
/

Используя ваши тестовые таблицы (ваш код DDL должен быть: CREATE TABLE table1 ... кстати), мы можем использовать следующий анонимный блок для выполнения процедуры.

-- not sure what the "IN" parameter is used for 
declare
  rowcount_in number := 0 ;  -- not needed
  rowcount_out number := 0 ;
begin
  test_proc2( rowcount_in, rowcount_out ) ;
  dbms_output.put_line( 'updated rows: ' || rowcount_out ) ;
end;
/

updated rows: 2

После выполнения анонимного блока таблицы содержат ...

SQL> select * from table1 ;
TABLE1_ID  MODIFIED_DATE  
1          15-MAY-18      
2          15-MAY-18      
3          14-MAY-18      


SQL> select * from table2 ;
TABLE2_ID  LAST_UPDATE  
1          16-MAY-18    
2          17-MAY-18    
NULL       16-MAY-18    
NULL       17-MAY-18 

Многие люди скажут вам, что вы должны использовать BULK-операции (BULK COLLECT, FORALL и т. Д.), Когда это возможно. Вам все это помогает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...