广州葆元健康生物科技有限公司


PL / SQL FOR LOOP

网络编程 PL / SQL FOR LOOP 09-19

有两种PL / SQL FOR循环:数字FOR循环和游标FOR循环。

数字FOR循环是传统的。当循环开始时,FOR循环的迭代次数是已知的。

这里是数字FOR循环的一般语法:

     FOR loop index IN [REVERSE]  lowest number .. highest number      LOOP         executable statement(s)      END LOOP; 

您必须在LOOP和END LOOP关键字之间至少有一个可执行语句。

 

实例

下面的循环执行10次; loop_counter从1开始,结束于10:

          FOR loop_counter IN 1 .. 10           LOOP              --executable statements ...           END LOOP; 

下面的循环执行10次; loop_counter从10开始,结束于1:

          FOR loop_counter IN REVERSE 1 .. 10           LOOP              ---executable statements ...           END LOOP; 

这里是一个循环,甚至不执行一次。

          FOR loop_counter IN REVERSE 10 .. 1           LOOP              ---executable statements ...           END LOOP; 

以下循环对由变量和表达式中的值确定的范围执行:

FOR calc_index IN start_period_number ..            LEAST (end_period_number, current_period) LOOP    --executable statements ... END LOOP; 

 

实例2

循环范围的边界可以是文字,变量或表达式,但它们必须求值为数字。

DECLARE  first  INTEGER := 1;   last   INTEGER := 10;   high   INTEGER := 100;   low    INTEGER := 12; BEGIN   -- Bounds are numeric literals:    FOR j IN -5..5 LOOP     NULL;   END LOOP;    -- Bounds are numeric variables:    FOR k IN REVERSE first..last LOOP     NULL;   END LOOP;    FOR step IN 0..(TRUNC(high/low) * 2) LOOP     NULL;   END LOOP; END; / 

 

实例3

在FOR-LOOP语句中使用计数器的递增

DECLARE   TYPE DateList IS TABLE OF DATE INDEX BY PLS_INTEGER;   dates DateList; BEGIN   FOR j IN 1..3 LOOP     dates(j*5) := SYSDATE;   END LOOP; END; / 

 

循环边界的动态范围

PL / SQL允许您通过使用变量的边界在运行时指定循环范围。

CREATE TABLE temp (   emp_no NUMBER,   email_addr VARCHAR2(50) ); --   www  .ja  v  a 2  s  .  comDECLARE   emp_count NUMBER := 4; BEGIN      FOR i IN 1..emp_count LOOP     INSERT INTO temp       VALUES(i, 'to be added later');   END LOOP; END; / select * from temp;drop table temp;

上面的代码生成以下结果:

循环边界的动态范围

 

注意

如果循环范围的下限大于上限,则不执行循环体。

使用现有变量作为循环变量

DECLARE  i NUMBER := 5; BEGIN   FOR i IN 1..3 LOOP     DBMS_OUTPUT.PUT_LINE ('Inside loop, i is ' || TO_CHAR(i));   END LOOP;    DBMS_OUTPUT.PUT_LINE ('Outside loop, i is ' || TO_CHAR(i)); END; / 

上面的代码生成以下结果:

如果循环范围的下限大于上限,则不执行循环体。

引用与内部计数器名称相同的外部计数器

BEGIN <<outer_loop>>   FOR i IN 1..3 LOOP     <<inner_loop>>     FOR i IN 1..3 LOOP       IF outer_loop.i = 2 THEN         DBMS_OUTPUT.PUT_LINE           ( 'outer: ' || TO_CHAR(outer_loop.i) || ' inner: '             || TO_CHAR(inner_loop.i));       END IF;     END LOOP inner_loop;   END LOOP outer_loop; END; / 

上面的代码生成以下结果:

引用与内部计数器名称相同的外部计数器

 

EXIT的示例

您可以使用标签给循环命名。PL / SQL中的循环标签具有以下格式:

<<label_name>> 

其中label_name是标签的名称,并且该循环标签紧接在LOOP语句之前出现:

     <<all_emps>>      FOR emp_rec IN emp_cur      LOOP         ...      END LOOP; 

EXIT语句使FOR循环提前完成。

DECLARE   v_employees employees%ROWTYPE;    CURSOR c1 is SELECT * FROM employees; BEGIN   OPEN c1;   -- Fetch entire row into v_employees record:   FOR i IN 1..10 LOOP     FETCH c1 INTO v_employees;     EXIT WHEN c1%NOTFOUND;     -- Process data here   END LOOP;   CLOSE c1; END; / 

EXIT与FOR LOOP中的标签

DECLARE   v_employees employees%ROWTYPE;    CURSOR c1 is SELECT * FROM employees; BEGIN   OPEN c1;    <<outer_loop>>   FOR i IN 1..10 LOOP     -- Process data here     FOR j IN 1..10 LOOP       FETCH c1 INTO v_employees;       EXIT outer_loop WHEN c1%NOTFOUND;       -- Process data here     END LOOP;   END LOOP outer_loop;    CLOSE c1; END; / 

 

游标FOR循环

游标FOR循环是与显式游标相关联的循环。

下面是游标FOR循环的基本语法:

     FOR record IN { cursor_name | (explicit SELECT statement) }      LOOP         executable statement(s)      END LOOP; 

其中记录是由PL / SQL使用%ROWTYPE属性对由cursor_name指定的游标隐式声明的记录。

循环的游标示例

DECLARE   CURSOR c_my IS SELECT id, room_number FROM occupancy;    my_rec c_my%ROWTYPE; BEGIN    OPEN c_my;    LOOP       FETCH c_my INTO my_rec;       EXIT WHEN c_my%NOTFOUND;       update_bill(my_rec.id, my_rec.room_number);     END LOOP;     CLOSE c_my; END; 

编辑:广州葆元健康生物科技有限公司

标签:游标,变量,标签,语句,边界