如何在循环的下一个迭代之前在Oracle中初始化变量



我有一个过程,其中我使用了很多变量,变量通过循环中的选择查询获取值。现在,每当循环启动的下一次迭代时,我都希望所有变量都应该重新初始化,即以上迭代中的所有值都应该消失。我已经通过手动将它们全部设置为null或零尝试了,但是它是昏昏欲睡的。

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;

您可能不必做任何事情。

select count(*)即使找不到任何东西,也会返回0,因此v_cnt1v_cnt2都会自动重新初始化,这将传播到v_cnt,因为它将获得 v_cnt1 + v_cnt2的最后值。<<<<<<<<<<<</p>

我知道这只是示例代码。如果 - 实际上 - 并不是那么简单,则在必要时初始化变量。通常,它是在LOOP关键字之后,但不必是。这取决于什么&amp;当您做某事时。

如果要解决麻烦,请将有意义的变量放在记录中。您可以定义工作记录和永不更改的初始记录,并且可以一次将初始化记录复制到工作记录。

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

最新更新