Как инициализировать переменные в Oracle до следующей итерации цикла? - PullRequest
0 голосов
/ 28 июня 2019

У меня есть процедура, в которой я использовал много переменных. Переменные получают значения по запросам выбора внутри цикла. Теперь всякий раз, когда на следующей итерации запуска цикла я хочу, чтобы все переменные были инициализированы, то есть все значения из предыдущей итерации должны быть удалены. Я попытался сделать это, установив вручную все из них на ноль или ноль, но это вялый ... Есть ли лучший способ сделать это?

BEGIN

  FOR I IN (SELECT ID FROM CUSTOMERS) LOOP

    SELECT COUNT(1) INTO V_CNT1 FROM TABLE1 T WHERE T.ID = I.ID;

    SELECT COUNT(1) INTO V_CNT2 FROM TABLE2 T WHERE T.ID = I.ID;

    V_CNT := V_CNT1 + V_CNT2;

    V_CNT  := 0;
    V_CNT1 := 0;
    V_CNT2 := 0;

  END LOOP;
end;

Ответы [ 2 ]

4 голосов
/ 28 июня 2019

Вам, вероятно, не нужно ничего делать.

select count(*) вернет 0, даже если ничего не найдет, поэтому и v_cnt1, и v_cnt2 будут повторно инициализированы автоматически, что распространяется на v_cnt по мере его 'Я получу сумму последних значений v_cnt1 + v_cnt2.

Я понимаю, что это всего лишь пример кода.Если - на самом деле - это не так просто, то инициализируйте переменные , когда необходимо .Обычно это сразу после ключевого слова LOOP, но не обязательно.Это зависит от того, что и когда ты делаешь.

1 голос
/ 28 июня 2019

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

declare
  type t_rec is record(
    v1 number,
    v2 varchar2(22),
    v3 integer,
    v4 date
  );
  c constant t_rec := new t_rec(0, null, 0, null);
  l t_rec;
begin
  for i in 1..3 loop
    l := c;
    dbms_output.put_line(l.v1);
    select 1, 'a', 2, sysdate into l from dual;
    dbms_output.put_line(l.v1);
  end loop;
end;
/

PL/SQL procedure successfully completed.

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