;'>在这里:
l loop_variable是循环变量。你可以使用一个已经存在的变量作为循环变量,或者您也可以循环一个新创建的变量(如果不存在指定的变量则发生这种情况)。通过每次循环,循环变量的值增加1(如果使用REVERSE关键字则减少)。
l REVERSE表示循环变量的值是每次通过循环递减。循环变量被初始化为上边界,是递减1,直到循环变量达到下边界。你必须指定前上部边界的下边界。
l lower_bound是循环的下边界。循环的循环变量初始化为这个较低的边界提供反向是不used.
l upper_bound的上边界。如果使用反向循环变量则初始化此上边界。
下面的例子显示了一个For循环。请注意,变量v_counter2中没有明确定义,所以FOR循环会自动创建一个新的整数变量名为v_counter2:
FOR v_counter2 IN 1..5
LOOP
DBMS_OUTPUT.PUT_LINE(v_counter2);
END LOOP;
The following example uses REVERSE:
FOR v_counter2 IN REVERSE 1..5
LOOP
DBMS_OUTPUT.PUT_LINE(v_counter2);
END LOOP;
在这个例子中,v_counter2从5开始,每次通过循环递减1,并等于1时结束。
5、游标
你可以使用游标来获取查询所返回的行。你使用游标中查询检索行,然后在光标每次从第一行取回。使用游标时,您通常会使用以下五个步骤:
(1)声明变量用来存储一个行的列值。
(2)声明游标,其中包含了查询。
(3)打开游标
(4)每次用光标一个从行中取值,存储在第1步中声明的变量的值。然后,进行一些与这些变量有关的操作,如在屏幕上显示出来,在计算中使用它们等。
(5)关闭游标。
在下面的章节中中,你将了解这五个步骤的细节,你会看到一个简单的例子,得到从产品表中产品资料,名称和价格列。
步骤1:声明变量来存储列值
第一个步骤是声明用于存储列值的变量。这些变量必须是兼容的列类型。
提示:
刚才你看到,可以使用%TYPE类型声明的变量时,你使用%TYPE的column。 如果您使用%TYPE声明变量时,变量会自动将正确的类型。下面的示例声明三个变量来存储从产品表中的产品资料,名称和价格列,%TYPE用于自动设置的变量类型相同类型的列:
DECLARE
v_product_id products.product_id%型;
v_name products.name%型;
v_price products.price%型;
步骤2:声明游标
第2步是声明游标。游标声明是一个你分配给光标或查询的执行的名称。游标声明,所有其他声明一样,要放在声明部分。声明游标的语法如下:
CURSOR cursor_name IS
SELECT_statement;
where
cursor_name is the name of the cursor.
SELECT_statement is the query.
在这里:
l cursor_name是游标的名称。
l 变量是可变的列值存储来自游标。
下面的例子声明了一个名为v_product_cursor查询的游标检索产品资料,姓名,以及从产品表列价格:
CURSOR v_product_cursor IS
SELECT product_id, name, price
FROM products
ORDER BY product_id;
查询直到打开游标才会执行。
第3步:打开游标
第3步是打开游标。使用OPEN语句打开游标,它必须放置在块中可执行文件里。下面的例子是执行查询,打开v_product_cursor:
OPEN v_product_cursor;
步骤4:取行光标
第4步是你使用FETCH语句从游标中提取行。FETCH语句读取的列值已在步骤1中声明的变量。FETCH使用语法如下:
FETCH cursor_name
INTO variable[, variable ...];
在这里:
l cursor_name是游标的名称。
l 变量是可变的列值,来自被存储游标。你需要提供每列值的匹配变量。
以下FETCH示例检索从v_product_cursor和商店中的列值的v_product_id,v_name v_price的变量,之前已在第1步中创建:
FETCH v_product_cursor
INTO v_product_id, v_name, v_price;
因为游标可能包含许多行,我们需要一个循环读取它们。为了弄清楚何时结束循环,你可以使用的布尔变量v_product_cursor%NOTFOUND。当没有更多的行在v_product_cursor读取是,这个变量为真。下面的例子显示了一个循环:
LOOP
-- fetch the rows from the cursor
FETCH v_product_cursor
INTO v_product_id, v_name, v_price;
-- exit the loop when there are no more rows, as indicated by
-- the Boolean variable v_product_cursor%NOTFOUND (= true when
-- there are no more rows)
EXIT WHEN v_product_cursor%NOTFOUND;
-- use DBMS_OUTPUT.PUT_LINE() to display the variables
DBMS_OUTPUT.PUT_LINE(
'v_product_id = ' || v_product_id || ', v_name = ' || v_name ||
', v_price = ' || v_price
);
END LOOP;
请注意,我用DBMS_OUTPUT.PUT_LINE()来显示读取的每一行的v_product_id,v_name,v_price变量。在实际应用中,你可以使用一个复杂的计算v_price。
第5步:关闭游标
第5步是使用CLOSE语句关闭游标。关闭游标后可以释放系统资源。以下示例关闭:
v_product_cursor:
CLOSE v_product_cursor;
PL/ SQL编程简介
Oracle数据库增加了一种程序的编程语言,即为被人熟知的PL / SQL(程序语言/ SQL)到Oracle数据库中。PL/ SQL使您可以编写包含SQL语句的程序。在本章中,您将了解下列PL / SQL内容:
l 块结构
l 变量和类型
l 条件逻辑
l 循环
l 返回游标:允许PL/ SQL读取结果查询
l 程序
l 功能
l 包:是用来组程序和功能集中在一个单位
l 触发器:这是当某个事件发生在运行代码块数据库
l Oracle 11g 数据库PL/ SQL功能的增强
您可以使用PL/ SQL数据库应用程序添加业务逻辑。这种集中式的业务逻辑可以通过任何可以访问数据库,包括SQL * Plus,Java,C#等的程序来运行。
注意:
对于如何通过Java访问数据库的全部细节,请参阅我的书Oracle9i的JDBC编程(Oracle出版社,2002年)。如何访问一个数据库,通过C#,看到我的书精通C#数据库编程(SYBEX2003)。
1. 块结构
PL / SQL程序被分成称为块的结构,每块都包含PL/SQL和SQL语句。 PL / SQL块的结构如下:
[DECLARE
declaration_statements
]
BEGIN
executable_statements
[EXCEPTION
exception_handling_statements
]
END;
/
在这里:
l declaration_statements声明变量可用在PL / SQL块的其余部分使用。声明块是可选的。
l executable_statements的实际是可执行语句,其中可能包括循环,条件逻辑等等。
l exception_handling_statements是可以处理任何在块运行过程中可能出现的执行错误的语句。异常块是可选的。
每个语句用分号(;)中止,一个PL / SQL块使用斜线(/)字符终止。在我开始讲述PL/ SQL的细节前,大家来看到一个简单的例子来体会这种语言。下面的例子(包含的area_example.sql脚本在SQL目录)计算已知面积、高度的矩形的宽度:
SET SERVEROUTPUT ON
DECLARE
v_width INTEGER;
v_height INTEGER := 2;
v_area INTEGER := 6;
BEGIN
-- set the width equal to the area divided by the height
v_width := v_area / v_height;
DBMS_OUTPUT.PUT_LINE('v_width = ' || v_width);
EXCEPTION
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE('Division by zero');
END;
/
当你在SQL * Plus运行脚本时,SET SERVEROUTPUT ON命令让服务器输出,所以你可以在屏幕上看到DBMS_OUTPUT.PUT_LINE()产生的线。当初始命令传至PL / SQL块本身后,就会分为声明块,开始块,异常块。
声明块包含三个整数变量名为v_width,v_height,v_area(我总是把V_在开始的变量名)的声明。其中v_height和v_area变量被初始化为2和6。
接下来是开始块,其中包含三行。第一行的注释包含文本“定义宽度与面积除以高度的值相等。第二行定义v_width,v_area除以v_height,这意味着v_width设置为3(= 6/2)。第三行调用DBMS_OUTPUT.PUT_LINE()在屏幕上显示v_width的值。DBMS_OUTPUT是一个内置的Oracle数据库的代码包; DBMS_OUTPUT在其他项目中,包含可让您的屏幕输出值的程序。
接下来,异常块处理任何将一个数字被零除的尝试。它通过“捕获”ZERO_DIVIDE的异常。在这个例子中,实际上没有被零除的尝试,但如果你改变v_height的值为0并运行该脚本,你将会看到异常。
脚本的最后,用正斜杠字符(/)表示PL / SQL块的结束。
下面的清单显示在SQL * Plus脚本中area_example.sql的执行情况:
SQL> @ C:\SQL\area_example.sql
v_width = 3
注意:
如果你的area_example.sql脚本在目录不是C:\ SQL,使用自己的目录中先前的命令。
2、变量和类型
声明块内声明的变量。正如你在前面的例子中看到,一个变量的声明都具有一个名称和一个类型。例如,v_width的变量即为v_width 整数型;
注意:
PL/ SQL类型是数据库的列类型相似。您可以在附录中看到的所有类型。下面的例子显示了更多的变量声明(这些变量可以用来存储从产品表中的列值):
v_product_id INTEGER;
v_product_type_id INTEGER;
v_name VARCHAR2 (30);
v_description VARCHAR2 (50);
v_price NUMBER (5, 2);
你也可以使用%TYPE关键字,它已经告知PL / SQL中使用相同类型指定表中的列指定变量的类型。下面的示例使用%TYPE声明一个变量相同类型的列的产品表,这是, NUMBER(5,2)价格:
v_product_ price products. price % TYPE;
3、有条件的逻辑
你可以使用IF,THEN,ELSE,ELSIF和END IF关键字来执行条件逻辑:
IF condition1 THEN
statements1
ELSIF condition2 THEN
statements2
ELSE
statements3
END IF;
在这里:
l 条件1和条件2是布尔表达式判定为真或假。
l 语句1,语句2,语句3是PL / SQL语句。
条件的逻辑流程如下:
l 如果条件1为真,则语句执行。
l 如果条件1为假,但条件2为真,则语句执行。
l 如果条件1或条件2都不为真,则语句执行。
你还可以嵌入另一个IF语句在IF语句,如下面的例子:
IF v_count > 0 THEN
v_message := 'v_count is positive';
IF v_area > 0 THEN
v_message := 'v_count and v_area are positive';
END IF
ELSIF v_count = 0 THEN
v_message := 'v_count is zero';
ELSE
v_message := 'v_count is negative';
END IF;
在这个例子中,如果v_count大于0,则v_message被设置为“是真的v_count”。如果v_count和 v_area是大于0,则v_message被设置为“v_count和v_area为真”。其余的逻辑很简单。
4、循环
你可以使用一个循环来运行语句零次或多次。在PL/ SQL中有三种类型的循环:
l 单循环:运行直到明确地结束循环。
l WHILE循环:运行直到出现指定的条件。
l FOR循环:按照预定数目的次数运行。
你将在下面的章节了解这些循环。
(1)单循环
运行一个单循环,直到你明确地结束循环。一个单循环的语法如下:
LOOP
statements
END LOOP;
结束循环,你可以使用一个EXIT或EXIT WHEN语句。EXIT语句立即结束一个循环,当指定的条件发生时EXIT WHEN语句结束循环。
下面的例子显示了一个单循环。在循环开始前甲名为v_counter的变量被初始化为0。循环每增加1到v_counter并并当v_counter等于5使用EXIT WHEN语句退出循环。
v_counter := 0;
LOOP
v_counter := v_counter + 1;
EXIT WHEN v_counter = 5;
END LOOP;
注意:
退出循环语句也可以出现在代码的任何地方。在Oracle 11g数据库中,你也可以使用的CONTINUE或CONTINUE WHEN语句结束当前迭代循环。CONTINUE语句无条件地结束当前的循环迭代,并继续执行下一次迭代。 CONTINUE WHEN语句当出现指定的条件时结束当前循环迭代时,然后继续执行下一次迭代。下面的例子显示CONTINUE语句的用法:
v_counter := 0;
LOOP
-- after the CONTINUE statement is executed, control returns here
v_counter := v_counter + 1;
IF v_counter = 3 THEN
CONTINUE; -- end current iteration unconditionally
END IF;
EXIT WHEN v_counter = 5;
END LOOP;
下一个例子显示了使用CONTINUE WHEN语句的用法:
v_counter := 0;
LOOP
-- after the CONTINUE WHEN statement is executed, control returns here
v_counter := v_counter + 1;
CONTINUE WHEN v_counter = 3; -- end current iteration when v_counter = 3
EXIT WHEN v_counter = 5;
END LOOP;
注意:
一个CONTINUE或CONTINUE WHEN语句不能跨越过程,函数或方法的。
(2)WHILE循环
while循环当指定的条件发生时运行。 WHILE循环的语法如下:
WHILE condition LOOP
statements
END LOOP;
下面的例子显示了一个当v_counter变量小于6时执行的while循环:
v_counter := 0;
WHILE v_counter < 6 LOOP
v_counter := v_counter + 1;
END LOOP;
(3)FOR循环
一个for循环运行预定的次数;你确定循环运行指定循环变量的上限和下限。然后循环变量递增(或递减),每一次循环。 FOR循环的语法如下:
FOR loop_variable IN [REVERSE] lower_bound..upper_bound
LOOP
statements
END LOOP;
在这里:
l loop_variable是循环变量。你可以使用一个已经存在的变量作为循环变量,或者您也可以循环一个新创建的变量(如果不存在指定的变量则发生这种情况)。通过每次循环,循环变量的值增加1(如果使用REVERSE关键字则减少)。
l REVERSE表示循环变量的值是每次通过循环递减。循环变量被初始化为上边界,是递减1,直到循环变量达到下边界。你必须指定前上部边界的下边界。
l lower_bound是循环的下边界。循环的循环变量初始化为这个较低的边界提供反向是不used.
l upper_bound的上边界。如果使用反向循环变量则初始化此上边界。
下面的例子显示了一个For循环。请注意,变量v_counter2中没有明确定义,所以FOR循环会自动创建一个新的整数变量名为v_counter2:
FOR v_counter2 IN 1..5
LOOP
DBMS_OUTPUT.PUT_LINE(v_counter2);
END LOOP;
The following example uses REVERSE:
FOR v_counter2 IN REVERSE 1..5
LOOP
DBMS_OUTPUT.PUT_LINE(v_counter2);
END LOOP;
在这个例子中,v_counter2从5开始,每次通过循环递减1,并等于1时结束。
5、游标
你可以使用游标来获取查询所返回的行。你使用游标中查询检索行,然后在光标每次从第一行取回。使用游标时,您通常会使用以下五个步骤:
(1)声明变量用来存储一个行的列值。
(2)声明游标,其中包含了查询。
(3)打开游标
(4)每次用光标一个从行中取值,存储在第1步中声明的变量的值。然后,进行一些与这些变量有关的操作,如在屏幕上显示出来,在计算中使用它们等。
(5)关闭游标。
在下面的章节中中,你将了解这五个步骤的细节,你会看到一个简单的例子,得到从产品表中产品资料,名称和价格列。
步骤1:声明变量来存储列值
第一个步骤是声明用于存储列值的变量。这些变量必须是兼容的列类型。
提示:
刚才你看到,可以使用%TYPE类型声明的变量时,你使用%TYPE的column。 如果您使用%TYPE声明变量时,变量会自动将正确的类型。下面的示例声明三个变量来存储从产品表中的产品资料,名称和价格列,%TYPE用于自动设置的变量类型相同类型的列:
DECLARE
v_product_id products.product_id%型;
v_name products.name%型;
v_price products.price%型;
步骤2:声明游标
第2步是声明游标。游标声明是一个你分配给光标或查询的执行的名称。游标声明,所有其他声明一样,要放在声明部分。声明游标的语法如下:
CURSOR cursor_name IS
SELECT_statement;
where
cursor_name is the name of the cursor.
SELECT_statement is the query.
在这里:
l cursor_name是游标的名称。
l 变量是可变的列值存储来自游标。
下面的例子声明了一个名为v_product_cursor查询的游标检索产品资料,姓名,以及从产品表列价格:
CURSOR v_product_cursor IS
SELECT product_id, name, price
FROM products
ORDER BY product_id;
查询直到打开游标才会执行。
第3步:打开游标
第3步是打开游标。使用OPEN语句打开游标,它必须放置在块中可执行文件里。下面的例子是执行查询,打开v_product_cursor:
OPEN v_product_cursor;
步骤4:取行光标
第4步是你使用FETCH语句从游标中提取行。FETCH语句读取的列值已在步骤1中声明的变量。FETCH使用语法如下:
FETCH cursor_name
INTO variable[, variable ...];
在这里:
l cursor_name是游标的名称。
l 变量是可变的列值,来自被存储游标。你需要提供每列值的匹配变量。
以下FETCH示例检索从v_product_cursor和商店中的列值的v_product_id,v_name v_price的变量,之前已在第1步中创建:
FETCH v_product_cursor
INTO v_product_id, v_name, v_price;
因为游标可能包含许多行,我们需要一个循环读取它们。为了弄清楚何时结束循环,你可以使用的布尔变量v_product_cursor%NOTFOUND。当没有更多的行在v_product_cursor读取是,这个变量为真。下面的例子显示了一个循环:
LOOP
-- fetch the rows from the cursor
FETCH v_product_cursor
INTO v_product_id, v_name, v_price;
-- exit the loop when there are no more rows, as indicated by
-- the Boolean variable v_product_cursor%NOTFOUND (= true when
-- there are no more rows)
EXIT WHEN v_product_cursor%NOTFOUND;
-- use DBMS_OUTPUT.PUT_LINE() to display the variables
DBMS_OUTPUT.PUT_LINE(
'v_product_id = ' || v_product_id || ', v_name = ' || v_name ||
', v_price = ' || v_price
);
END LOOP;
请注意,我用DBMS_OUTPUT.PUT_LINE()来显示读取的每一行的v_product_id,v_name,v_price变量。在实际应用中,你可以使用一个复杂的计算v_price。
第5步:关闭游标
第5步是使用CLOSE语句关闭游标。关闭游标后可以释放系统资源。以下示例关闭:
v_product_cursor:
CLOSE v_product_cursor;
, PL/ SQL编程简介
Oracle数据库增加了一种程序的编程语言,即为被人熟知的PL / SQL(程序语言/ SQL)到Oracle数据库中。PL/ SQL使您可以编写包含SQL语句的程序。在本章中,您将了解下列PL / SQL内容:
l 块结构
l 变量和类型
l 条件逻辑
l 循环
l 返回游标:允许PL/ SQL读取结果查询
l 程序
l 功能
l 包:是用来组程序和功能集中在一个单位
l 触发器:这是当某个事件发生在运行代码块数据库
l Oracle 11g 数据库PL/ SQL功能的增强
您可以使用PL/ SQL数据库应用程序添加业务逻辑。这种集中式的业务逻辑可以通过任何可以访问数据库,包括SQL * Plus,Java,C#等的程序来运行。
注意:
对于如何通过Java访问数据库的全部细节,请参阅我的书Oracle9i的JDBC编程(Oracle出版社,2002年)。如何访问一个数据库,通过C#,看到我的书精通C#数据库编程(SYBEX2003)。
1. 块结构
PL / SQL程序被分成称为块的结构,每块都包含PL/SQL和SQL语句。 PL / SQL块的结构如下:
[DECLARE
declaration_statements
]
BEGIN
executable_statements
[EXCEPTION
exception_handling_statements
]
END;
/
在这里:
l declaration_statements声明变量可用在PL / SQL块的其余部分使用。声明块是可选的。
l executable_statements的实际是可执行语句,其中可能包括循环,条件逻辑等等。
l exception_handling_statements是可以处理任何在块运行过程中可能出现的执行错误的语句。异常块是可选的。
每个语句用分号(;)中止,一个PL / SQL块使用斜线(/)字符终止。在我开始讲述PL/ SQL的细节前,大家来看到一个简单的例子来体会这种语言。下面的例子(包含的area_example.sql脚本在SQL目录)计算已知面积、高度的矩形的宽度:
SET SERVEROUTPUT ON
DECLARE
v_width INTEGER;
v_height INTEGER := 2;
v_area INTEGER := 6;
BEGIN
-- set the width equal to the area divided by the height
v_width := v_area / v_height;
DBMS_OUTPUT.PUT_LINE('v_width = ' || v_width);
EXCEPTION
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE('Division by zero');
END;
/
当你在SQL * Plus运行脚本时,SET SERVEROUTPUT ON命令让服务器输出,所以你可以在屏幕上看到DBMS_OUTPUT.PUT_LINE()产生的线。当初始命令传至PL / SQL块本身后,就会分为声明块,开始块,异常块。
声明块包含三个整数变量名为v_width,v_height,v_area(我总是把V_在开始的变量名)的声明。其中v_height和v_area变量被初始化为2和6。
接下来是开始块,其中包含三行。第一行的注释包含文本“定义宽度与面积除以高度的值相等。第二行定义v_width,v_area除以v_height,这意味着v_width设置为3(= 6/2)。第三行调用DBMS_OUTPUT.PUT_LINE()在屏幕上显示v_width的值。DBMS_OUTPUT是一个内置的Oracle数据库的代码包; DBMS_OUTPUT在其他项目中,包含可让您的屏幕输出值的程序。
接下来,异常块处理任何将一个数字被零除的尝试。它通过“捕获”ZERO_DIVIDE的异常。在这个例子中,实际上没有被零除的尝试,但如果你改变v_height的值为0并运行该脚本,你将会看到异常。
脚本的最后,用正斜杠字符(/)表示PL / SQL块的结束。
下面的清单显示在SQL * Plus脚本中area_example.sql的执行情况:
SQL> @ C:\SQL\area_example.sql
v_width = 3
注意:
如果你的area_example.sql脚本在目录不是C:\ SQL,使用自己的目录中先前的命令。
2、变量和类型
声明块内声明的变量。正如你在前面的例子中看到,一个变量的声明都具有一个名称和一个类型。例如,v_width的变量即为v_width 整数型;
注意:
PL/ SQL类型是数据库的列类型相似。您可以在附录中看到的所有类型。下面的例子显示了更多的变量声明(这些变量可以用来存储从产品表中的列值):
v_product_id INTEGER;
v_product_type_id INTEGER;
v_name VARCHAR2 (30);
v_description VARCHAR2 (50);
v_price NUMBER (5, 2);
你也可以使用%TYPE关键字,它已经告知PL / SQL中使用相同类型指定表中的列指定变量的类型。下面的示例使用%TYPE声明一个变量相同类型的列的产品表,这是NUMBER(5,2)价格:
v_product_ price products. price % TYPE;
3、有条件的逻辑
你可以使用IF,THEN,ELSE,ELSIF和END IF关键字来执行条件逻辑:
IF condition1 THEN
statements1
ELSIF condition2 THEN
statements2
ELSE
statements3
END IF;
在这里:
l 条件1和条件2是布尔表达式判定为真或假。
l 语句1,语句2,语句3是PL / SQL语句。
条件的逻辑流程如下:
l 如果条件1为真,则语句执行。
l 如果条件1为假,但条件2为真,则语句执行。
l 如果条件1或条件2都不为真,则语句执行。
你还可以嵌入另一个IF语句在IF语句,如下面的例子:
IF v_count > 0 THEN
v_message := 'v_count is positive';
IF v_area > 0 THEN
v_message := 'v_count and v_area are positive';
END IF
ELSIF v_count = 0 THEN
v_message := 'v_count is zero';
ELSE
v_message := 'v_count is negative';
END IF;
在这个例子中,如果v_count大于0,则v_message被设置为“是真的v_count”。如果v_count和 v_area是大于0,则v_message被设置为“v_count和v_area为真”。其余的逻辑很简单。
4、循环
你可以使用一个循环来运行语句零次或多次。在PL/ SQL中有三种类型的循环:
l 单循环:运行直到明确地结束循环。
l WHILE循环:运行直到出现指定的条件。
l FOR循环:按照预定数目的次数运行。
你将在下面的章节了解这些循环。
(1)单循环
运行一个单循环,直到你明确地结束循环。一个单循环的语法如下:
LOOP
statements
END LOOP;
结束循环,你可以使用一个EXIT或EXIT WHEN语句。EXIT语句立即结束一个循环,当指定的条件发生时EXIT WHEN语句结束循环。
下面的例子显示了一个单循环。在循环开始前甲名为v_counter的变量被初始化为0。循环每增加1到v_counter并并当v_counter等于5使用EXIT WHEN语句退出循环。
v_counter := 0;
LOOP
v_counter := v_counter + 1;
EXIT WHEN v_counter = 5;
END LOOP;
注意:
退出循环语句也可以出现在代码的任何地方。在Oracle 11g数据库中,你也可以使用的CONTINUE或CONTINUE WHEN语句结束当前迭代循环。CONTINUE语句无条件地结束当前的循环迭代,并继续执行下一次迭代。 CONTINUE WHEN语句当出现指定的条件时结束当前循环迭代时,然后继续执行下一次迭代。下面的例子显示CONTINUE语句的用法:
v_counter := 0;
LOOP
-- after the CONTINUE statement is executed, control returns here
v_counter := v_counter + 1;
IF v_counter = 3 THEN
CONTINUE; -- end current iteration unconditionally
END IF;
EXIT WHEN v_counter = 5;
END LOOP;
下一个例子显示了使用CONTINUE WHEN语句的用法:
v_counter := 0;
LOOP
-- after the CONTINUE WHEN statement is executed, control returns here
v_counter := v_counter + 1;
CONTINUE WHEN v_counter = 3; -- end current iteration when v_counter = 3
EXIT WHEN v_counter = 5;
END LOOP;
注意:
一个CONTINUE或CONTINUE WHEN语句不能跨越过程,函数或方法的。
(2)WHILE循环
while循环当指定的条件发生时运行。 WHILE循环的语法如下:
WHILE condition LOOP
statements
END LOOP;
下面的例子显示了一个当v_counter变量小于6时执行的while循环:
v_counter := 0;
WHILE v_counter < 6 LOOP
v_counter := v_counter + 1;
END LOOP;
(3)FOR循环
一个for循环运行预定的次数;你确定循环运行指定循环变量的上限和下限。然后循环变量递增(或递减),每一次循环。 FOR循环的语法如下:
FOR loop_variable IN [REVERSE] lower_bound..upper_bound
LOOP
statements
END LOOP;