FOR语句
FOR循环是一种常用的控制结构,用于遍历一系列值或从游标中获取数据。FOR循环大致可分为三种类型:
- 指定上下边界的FOR循环
- 使用游标的FOR循环
- 使用匿名游标的FOR循环
指定上下边界的FOR循环
指定上下边界的FOR循环由两个数值下界lower_bound
和上界higher_bound
构成循环变量的取值范围。
- 若无关键字 REVERSE,则循环变量的取值将从小到大,步长为1,直到超过最大值后,程序退出循环。
- 若有关键字REVERSE,则循环变量从大到小,步长为-1,直到低于最小值,程序退出循环。
说明:
当使用
REVERSE
关键字后,后续循环定义参数必须从大到小,否则将不进入循环体。
语法格式
sql
FOR ColId IN lower_bound..higher_bound LOOP
pl_stmt_list
{END FOR | ENDFOR | ENDLOOP};
参数说明
ColId
:循环变量,用于存储当前的迭代值。lower_bound
:循环的起始值。higher_bound
:循环的结束值。pl_stmt_list
:循环体内的一组PL/SQL语句。
示例
定义x与y参数变量,并对x赋予初值100,通过FOR循环进行10次数据叠加操作,增加数值从10递减到1,最后将x值赋予y并输出y值。
sql
DECLARE
x INT;
y INT;
BEGIN
x := 100;
FOR v_counter IN REVERSE 10 .. 1 LOOP
x := x + v_counter;
END LOOP;
y := x;
SEND_MSG(y);
END;
/
-- 输出
155
使用游标的FOR循环
ColId取值从游标的记录集的第一条起,到游标的记录集的最后一条止,每取一条记录值时,循环体执行一次,循环体中通常可加入对记录(由ColId指代)字段的引用,以实现程序对查询结果的处理。
语法格式
sql
FOR ColId IN cursor_name LOOP
pl_stmt_list
{END FOR | ENDFOR | ENDLOOP};
参数说明
ColId
:循环变量,用于存储从游标中提取的每一行数据。cursor_name
:显式游标的名称。pl_stmt_list
:循环体内的一组PL/SQL语句。
示例
通过游标循环打印出当前用户下所有表对象的表名。使用游标循环定义时,可直接使用variable_name.filed_name访问游标字段。
sql
-- 创建表
CREATE TABLE t_tables (table_name VARCHAR2(100), table_type VARCHAR2(50), owner VARCHAR2(50));
-- 插入数据
INSERT INTO t_tables (table_name, table_type, owner) VALUES ('TABLE1', 'TABLE', 'OWNER1')('TABLE2', 'TABLE', 'OWNER2')('TABLE3', 'VIEW', 'OWNER3');
-- 主PL/SQL块
DECLARE
CURSOR cur IS
SELECT * FROM t_tables;
BEGIN
FOR i IN cur LOOP
SEND_MSG(i.table_name);
END LOOP;
END;
/
-- 输出
TABLE1
TABLE2
TABLE3
使用匿名游标的FOR循环
匿名游标无需在声明处定义,而使用SELECT子句形成匿名调用,即无需通过游标名进行调用。
语法格式
sql
FOR ColId IN select_with_parens LOOP
pl_stmt_list
{END FOR | ENDFOR | ENDLOOP};
参数说明
ColId
:循环变量,用于存储从查询中提取的每一行数据。select_with_parens
:一个包含SELECT语句的表达式。pl_stmt_list
:循环体内的一组PL/SQL语句。
示例
sql
-- 创建表
CREATE TABLE t_tables (table_name VARCHAR2(100), table_type VARCHAR2(50), owner VARCHAR2(50));
-- 插入数据
INSERT INTO t_tables (table_name, table_type, owner) VALUES ('TABLE1', 'TABLE', 'OWNER1')('TABLE2', 'TABLE', 'OWNER2')('TABLE3', 'VIEW', 'OWNER3');
-- 主PL/SQL块
DECLARE
CURSOR cur IS
SELECT * FROM t_tables;
BEGIN
FOR i IN (SELECT * FROM t_tables) LOOP
SEND_MSG(i.table_name);
END LOOP;
END;
/
-- 输出
TABLE1
TABLE2
TABLE3