Oracle

無法訪問 PL/SQL 中 For 循環計數器的值

  • November 22, 2015

我嘗試在教程中學習 PL/SQL for loops。我在 for 循環中學習控制流程。(我看到它與大多數其他程式語言相同)

這是 for 循環中的控制流程:

  1. 首先執行初始步驟,並且只執行一次。此步驟允許您聲明和初始化任何循環控制變數。
  1. 接下來,評估條件,即initial_value .. final_value。如果為 TRUE,則執行循環體。如果為 FALSE,則不執行循環體,控制流將跳轉到 for 循環之後的下一條語句。

3、for循環體執行完畢後,計數器變數的值增加或減少。

  1. 現在再次評估條件。如果為 TRUE,則執行循環並重複該過程(循環體,然後遞增步驟,然後再次條件)。條件變為 FALSE 後,FOR-LOOP 終止。

然後我想在我的 TOAD IDE 中測試這些步驟來解決我的擔憂。我使用簡單的範常式式碼進行測試,如下所示。

DECLARE
  a number(2) ;
BEGIN
  FOR a IN REVERSE 10 .. 20 LOOP
     dbms_output.put_line('value of a: ' || a);
  END LOOP;
END;
/

現在這個循環啟動初始計數器、initial_value 和 final_value。計數器是 ‘a’,initial_value 是 10,final_value 是 20。由於 REVERSE 關鍵字,計數器 a 將是 20 中的第一個。循環體執行 20 次。循環體執行後,a 減少。它將是 19。然後評估條件。條件為真,因為 19 在

$$ 10, 20 $$. 然後執行 for 循環體。該操作以相同方式繼續。當計數器 a 的值為 9,然後條件評估為 FALSE。然後循環終止。控制流在 for 循環之後跳轉到下一條語句。計數器的最後一個值為 9。我想查看它的 9 值。以便我在程式碼下方執行。

DECLARE
  a number(2) ;
BEGIN
  FOR a IN REVERSE 10 .. 20 LOOP
     dbms_output.put_line('value of a: ' || a);
  END LOOP;
  dbms_output.put_line('THE FINAL VALUE OF a: ' || a);
END;
/

執行上述程式碼時,會產生以下結果:

value of a: 20
value of a: 19
value of a: 18
value of a: 17
value of a: 16
value of a: 15
value of a: 14
value of a: 13
value of a: 12
value of a: 11
value of a: 10
THE FINAL VALUE OF a:

但我希望看到如下結果:

value of a: 20
value of a: 19
value of a: 18
value of a: 17
value of a: 16
value of a: 15
value of a: 14
value of a: 13
value of a: 12
value of a: 11
value of a: 10
THE FINAL VALUE OF a: 9

為什麼在循環後沒有連接計數器“a”。為什麼我沒有看到它的值 9。程序編譯器沒有對計數器’a’進行真正的賦值嗎?

問題是a您在聲明部分中聲明的變數a與在循環上下文中聲明的變數不同。您已經聲明了兩個不同的變數,它們以a不同的範圍命名。

如果您在沒有聲明部分的情況下執行塊,您會注意到即使您沒有a在聲明部分中聲明變數,它也可以工作。當您編寫for循環時,您的計數器是隱式聲明的,並且僅在循環內的範圍內。之後end loop,您不能再引用該變數。

BEGIN
  FOR a IN REVERSE 10 .. 20 LOOP
     dbms_output.put_line('value of a: ' || a);
  END LOOP;
END;

如果您想顯式聲明您在循環中使用的變數並且希望能夠在循環外引用該變數,您可以編寫一個while循環

declare
 i integer;
begin
 i := 20;
 while i >= 10
 loop
   dbms_output.put_line( 'In loop: ' || i );
   i := i - 1;
 end loop;
 dbms_output.put_line( 'Final value: ' || i );
end;

引用自:https://dba.stackexchange.com/questions/121815