Skip to content

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