手抄报 安全手抄报 手抄报内容 手抄报图片 英语手抄报 清明节手抄报 节约用水手抄报

PL/SQL的for循环语句

时间:2024-10-16 04:51:15

PL/SQL中有迷撞笸痉两种类型的FOR循环:数字型FOR循环和游标型FOR循环。数值型FOR循环式传统的大家熟悉的“计数”循环,这种FOR循环的迭代次数在循环开始的时观锻娜叼候就知道了。如果在FOR循环的范围处没有设置循环索引的递进方向从低到高或者从高到低(reverse将范围条件置反)。语法如下:

FOR loopIndex IN [REVERSE] lowest_number..heighest_number

LOOP

. . . 可以执行的语句

END LOOP;

使用这种循环的原因:

如果只想有限次的执行一段代码,又不想过早的结束循环,就可以使用数值型的FOR循环。

【如】输出从satrtIndex开始到endIndex的数字

PROCEDURE display_number(

startIndexININTEGER,

endIndex IN INTEGER

)AS

BEGIN

FORcurrentIndexINstartIndex..endIndex

LOOP

DBMS_OUTPUT.PUT_LINE(currentIndex);

END LOOP;

END;

FOR info IN (SELECT * FROM student)

LOOP

. . . info.C_NAME

END LOOP;

使用数字型FOR循环的规则:

a、不要声明循环索引,PL/SQL会自动、隐式的用一个INTEGER类型的局部变量作为循环索引。作用范围就是该循环本省,不能在循环之外使用

b、在范围部分使用的表达式会在循环开始时被求值一次。范围部分不会随着循环的反复执行而被重复求值,如果在循环体内部改变范围表达式使用的变量,这种改变对范围边界没有任何作用

c、在循环体内部不要改变索引值或者范围边界值。

d、使用reverse关键字可以迫使循环从上边界到下边界递减进行,但是你必须保证上边界大于下边界

处理非平滑增长:

PL/SQL并没有提供可以指定特殊的累进步幅得“进步”语法。在PL/SQL中数值型的FOR循环的各种变体中,递进步幅总是为1为单位进步。如果让循环只有当遇到1到100之间的偶数时才执行?你可以使用MOD函数。如:

FOR loop_index IN 1..100 LOOP

IF MOD (loop_index, 2) = 0 THEN

calc_values(loop_index);

END IF;

END LOOP;

或者

FOR loop_index IN 1..50 LOOP

calc_values(loop_index*2);

END LOOP;

游标型FOR循环:

游标型FOR循环是和一个现实游标或者直接放在循环边界中的SELECT语句关联在一起的循环。如果你需要取出游标的每条记录依次处理,就可以使用游标FOR循环,而这种也是游标的主要用法。语法如下:

FOR record IN {cursor_name | select statement}

LOOP

executable statements

END LOOP;

其中record是一个记录,这个记录是PL/SQL根据cursor_name这个游标%ROWTYPE属性隐式声明出来的。注意:不要现实的声明一个与循环索引(record)同名的记录,会导致逻辑错误。直接在循环中嵌套SELECT语句。

FOR student IN (SELECT * FROM students)

LOOP

DBMS_OUTPUT.PUT_LINE( student.N_USERNAME );

END LOOP;

然而,应该避免使用这种方式,因为SELECT出现在了不该出现的地方,维护难以理解。

如:我们将更新所有员工的薪水。

方式一:

DECLARE

CURSOR student_cursor IS

SELECT id, name, salaray FROM employers;

student student_cursor%ROWTYPE;

BEGIN

OPENstudent_cursor;

LOOP

FETCHstudent_cursorINTO student;

EXIT WHENstudent_cursor%NOTFOUND;

UPDATE students SET salary=student .salary*0.3 WHERE id=student.id;

END LOOP;

CLOSEstudent_cursor;

END;

方式二:

DECLARE

CURSOR student_cursor IS

SELECT id, name, salaray FROM employers;

BEGIN

LOOP student INstudent_cursor

UPDATE students SET salary=student .salary*0.3 WHERE id=student.id;

END LOOP;

END;

© 手抄报圈