Как получить общее количество обновленных строк, если у нас есть несколько таблиц внутри цикла for в PLSQL? - PullRequest
0 голосов
/ 23 октября 2018

У меня есть ситуация, когда логическая инструкция DML может быть изменена в любой момент времени, но другая часть останется прежней.

Короче говоря, мне нужно создать шаблон, в который я могу добавить 1 или несколькоКоманда DML и сообщение о том, что мне нужно вычислить общее количество строк, затронутых командой DML.

Для текущей ситуации у меня есть команда DML в цикле For, и внутри цикла существует другая таблица для действия обновления.

Структура SQL:

CREATE TABLE TEMP_A
  (NAME VARCHAR2(20), ID VARCHAR2(20)
  );
INSERT INTO TEMP_A VALUES
  ('SAM',100
  );
INSERT INTO TEMP_A VALUES
  ('SAM',100
  );
INSERT INTO TEMP_A VALUES
  ('SAM',100
  );
INSERT INTO TEMP_A VALUES
  ('JACK',200
  );
INSERT INTO TEMP_A VALUES
  ('JACK',200
  );
INSERT INTO TEMP_A VALUES
  ('JACK',200
  );
INSERT INTO TEMP_A VALUES
  ('HAMES',300
  );
INSERT INTO TEMP_A VALUES
  ('HAMES',300
  );
INSERT INTO TEMP_A VALUES
  ('HAMES',300
  );
COMMIT;


CREATE TABLE TEMP_C
  (NAME VARCHAR2(20), ID VARCHAR2(20)
  );
INSERT INTO TEMP_C VALUES
  ('SAM',100
  );
INSERT INTO TEMP_C VALUES
  ('RAM',100
  );
INSERT INTO TEMP_C VALUES
  ('KAM',200
  );
COMMIT;


CREATE TABLE TEMP_B
(ID VARCHAR2(20));

INSERT INTO TEMP_B VALUES(100);
INSERT INTO TEMP_B VALUES(200);
INSERT INTO TEMP_B VALUES(300);

COMMIT;

Блок PLSQL:

    DECLARE 
   i number(2);
BEGIN
        FOR i in (select ID from TEMP_B) loop
        merge into  TEMP_A c
        using( select i.ID new_id from dual) t
        on
        (t.new_id = i.ID)
        when matched then update set
        c.id = 555;

    merge into  TEMP_C c
        using( select i.ID new_id from dual) t
        on
        (t.new_id = i.ID)
        when matched then update set
        c.id = 555;

        end loop;
   dbms_output.put_line('Total affecetd records are :' || SQL%ROWCOUNT);

END;
/

Вывод:

Total affected records are :3

В идеале я искал вывод как 12 (Общее количество не затронутых строк из обеих таблиц внутри цикла), но я получаю выходные данные только для последнего запроса, что должно быть сделано, если мне нужно получить выходные данные всех строк, затронутых внутри цикла, блок DML можно изменить в любойя не могу добавить пользовательский оператор SQL% ROWCOUNT и объединить его. Я ищу общий подход, если таковой имеется.

Ответы [ 3 ]

0 голосов
/ 23 октября 2018
DECLARE
   I               NUMBER (2);
   AFFECTED_ROWS   NUMBER;
BEGIN
   AFFECTED_ROWS := 0;

   FOR I IN (SELECT ID FROM TEMP_B)
   LOOP
      MERGE INTO TEMP_A C
           USING (SELECT I.ID NEW_ID FROM DUAL) T
              ON (T.NEW_ID = I.ID)
      WHEN MATCHED
      THEN
         UPDATE SET C.ID = 555;

      AFFECTED_ROWS := AFFECTED_ROWS + SQL%ROWCOUNT;

      MERGE INTO TEMP_C C
           USING (SELECT I.ID NEW_ID FROM DUAL) T
              ON (T.NEW_ID = I.ID)
      WHEN MATCHED
      THEN
         UPDATE SET C.ID = 555;

      AFFECTED_ROWS := AFFECTED_ROWS + SQL%ROWCOUNT;
   END LOOP;

   DBMS_OUTPUT.PUT_LINE ('Total affecetd records are :' || AFFECTED_ROWS);
END;
/

AFFECTED_ROWS хранит сумму значений SQL% ROWCOUNT для каждого оператора.

0 голосов
/ 23 октября 2018

блок DML может быть изменен в любой момент времени, поэтому я не могу добавить собственный оператор SQL% ROWCOUNT и объединить его. Я ищу универсальный подход, если какой-либо

Я недумаю, что есть.Вы, вероятно, должны суммировать количество строк всех ваших операторов DML.И да, вы можете добавить пользовательскую переменную rowcount и добавить это.Почему ты не должен быть в состоянии?Если вы добавляете еще один MERGE, вы добавляете еще одну сумму: = сумма + SQL% ROWCOUNT.Если вы создаете свой DML динамически на другом языке программирования, вы создаете этот исходный код прямо здесь, так что вам даже не о чем беспокоиться.Я могу вспомнить любую ситуацию, в которой невозможно сложить количество строк.

0 голосов
/ 23 октября 2018

SQL% ROWCOUNT дает вам количество строк только для последнего выполненного оператора.По этой причине вы получаете значение последнего запроса, выполненного в цикле.

Возможно, вам придется запускать% ROWCOUNT после каждого выполнения запроса и сохранять возвращаемое значение в переменной.Это сработает.

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