/ SQL>/
PL/SQL procedure successfully completed. SQL>select location_id, city, country_id from locations where country_id = 'CA';
LOCATION_ID CITY CO
----------- ------------------------------ --
1800 Toronto CA
1900 Whitehorse CA
1901 Montreal CA
1902 Montreal CA
1903 Montreal CA
-- 执行了循环语句后,多了三条记录
二、WHILE循环
WHILE循环的格式如下: WHILE condition LOOP statement1; statement2; ... END LOOP;
WHILE循环是指当condition的结果为TRUE时,就执行循环体。它的循环体可以执行0次或多次,比较适用于循环次数不确定的情况。当条件不满足,就会自动退出循环。
现在使用WHILE循环来改写之前的例子: SQL>edit
DECLARE
v_countryid locations.country_id%TYPE :='CA';
v_loc_id locations.location_id%TYPE;
v_counter NUMBER(2) := 1;
v_new_city locations.city%TYPE := 'Montreal';
BEGIN
SELECT MAX(location_id)
INTO v_loc_id
FROM locations
WHERE country_id =v_countryid;
WHILE v_counter /
PL/SQL procedure successfully completed. SQL>select location_id, city, country_id from locations where country_id = 'CA';
LOCATION_ID CITY CO
----------- ------------------------------ --
1800 Toronto CA
1900 Whitehorse CA
1901 Montreal CA
1902 Montreal CA
1903 Montreal CA
1904 Montreal CA
1905 Montreal CA
1906 Montreal CA
8 rows selected. -- 又多了三条记录
如果条件一次都不满足,WHILE循环会出现一次都不执行的情况。 三、FOR循环
FOR循环的基本格式为: FORcounter IN [REVERSE] -- REVERSE是关键字,表示反过来循环,如从10到1进行循环 lower_bound..upper_bound LOOP --分别是下边界和上边界,变量counter和上下边界都必须是数值型 statement1; statement2; ... ENDLOOP;
FOR循环多用于循环次数已知的情况,FOR循环不需要专门声明一个变量作为计数器。它的计数器出了FOR循环之后是不可以使用的,如果一定要使用,建议还是专门声明一个计数器。和其他语言的FOR循环不同的是,用户不能自定义步长,如果想自定义步长,可以用基本循环或WHILE循环代替。
下面用FOR循环来改写之前的例子: SQL>edit
DECLARE
v_countryid locations.country_id%TYPE :='CA';
v_loc_id locations.location_id%TYPE;
v_new_city locations.city%TYPE := 'Montreal';
BEGIN
SELECT MAX(location_id)
INTO v_loc_id
FROM locations
WHERE country_id =v_countryid;
FOR i IN 1..3
-- 这里的i不需要在DECLARE部分专门声明,1和3分别是这个循环的下边界和上边界
--FOR循环的步长是固定的,不能自行定义
LOOP
INSERT INTOlocations(location_id, city, country_id)
VALUES((v_loc_id + i),v_new_city, v_countryid);
END LOOP;
-- DBMS_OUTPUT.PUT_LINE('The counter is ' || i);
-- 第一次执行先打开注解,用来验证计数器出了循环之后的情况。
COMMIT;
END;
/ SQL>/
*
ERROR at line 16:
ORA-06550: line 16, column 44:
PLS-00201: identifier 'I' must be declared
ORA-06550: line 16, column 2:
PL/SQL: Statement ignored
-- 报错是因为计数器i没有声明,因此出了FOR循环就不能使用了。
SQL>/
PL/SQL procedure successfully completed. SQL>select location_id, city, country_id from locations where country_id = 'CA';
LOCATION_ID CITY CO
----------- ------------------------------ --
1800 Toronto CA
1900 Whitehorse CA
1901 Montreal CA
1902 Montreal CA
1903 Montreal CA
1904 Montreal CA
1905 Montreal CA
1906 Montreal CA
1907 Montreal CA
1908 Montreal CA
1909 Montreal CA
11 rows selected.
-- 又多了三条记录
FOR循环是比较受欢迎一种循环,因为它的循环次数可控,不过使用FOR循环,需要注意一些基本的规则:
A. 计数器counter只能在循环内部引用,它不需要在循环外部定义;
B. 不要为计数器counter赋值,它的赋值是自动完成的,但是可以将计数器的值赋值给其他变量;
C. 不要使用NULL值作为循环次数的下界和上界;
D. 下界和上界可以为非整数,但非整数会被自动计算为整数;
E. 加了关键字REVERSE之后表示循环的次数为倒序,即从上界向下界执行,但是即使使用了REVERSE,下界的值仍然应该比上界的值小,下面举个例子来演示REVERSE的用法: SQL> edit
BEGIN
DBMS_OUTPUT.PUT_LINE('--------Normal--------');