服务器 频道

PL/pgSQL控制结构

    使用LOOP,WHILE,FOR 和 EXIT 语句,你可以控制你的 PL/pgSQL 函数重复一系列命令。
 
    LOOP
[<<label>>]
LOOP
    statements
END LOOP;
   
    LOOP 定义一个无条件的循环,无限循环,直到由EXIT或者RETURN语句终止。 可选的标签可以由EXIT语句使用,用于在嵌套循环中声明应该结束哪一层循环。

    EXIT

EXIT [ label ] [ WHEN expression ];
  
    如果没有给出 label, 那么退出最内层的循环,然后执行跟在END LOOP后面的语句。 如果给出 label, 那么它必须是当前或者更高层的嵌套循环块或者块的标签。 然后该命名块或者循环就会终止,而控制落到对应循环/块的 END 语句后面的语句上。

    如果出现了WHEN,循环退出只发生在声明的条件为真的时候, 否则控制会落到EXIT后面的语句上。

   EXIT 可以用于在所有的循环类型中提前退出; 它并不仅限于在无条件循环中使用。

例子:

LOOP
    -- 一些计算
    IF count > 0 THEN
        EXIT;  -- exit loop
    END IF;
END LOOP;

LOOP
    -- 一些计算
    EXIT WHEN count > 0;
END LOOP;

BEGIN
    -- 一些计算
    IF stocks > 100000 THEN
        EXIT;  -- 导致从 BEGIN 块里退出
    END IF;
END;

     WHILE

[<<label>>]
WHILE expression LOOP
    statements
END LOOP;
    只要条件表达式为真,WHILE语句就会不停在一系列语句上进行循环. 条件是在每次进入循环体的时候检查的.

比如:

WHILE amount_owed > 0 AND gift_certificate_balance > 0 LOOP
    -- 可以在这里做些计算
END LOOP;

WHILE NOT BOOLEAN_expression LOOP
    -- 可以在这里做些计算
END LOOP;

     FOR (整数变种)
[<<label>>]
FOR name IN [ REVERSE ] expression .. expression LOOP
    statements
END LOOP;

    这种形式的FOR对一定范围的整数数值进行迭代的循环。 变量name 会自动定义为integer类型并且只在循环里存在。 给出范围上下界的两个表达式在进入循环的时候计算一次。 迭代步进值总是为 1,但如果声明了REVERSE就是 -1。

一些整数FOR循环的例子∶

FOR i IN 1..10 LOOP
  -- 这里可以放一些表达式
    RAISE NOTICE ''i IS %'', i;
END LOOP;

FOR i IN REVERSE 10..1 LOOP
    -- 这里可以放一些表达式
END LOOP;

    如果下界大于上界(或者是在 REVERSE 情况下是小于),那么循环体将完全不被执行。 而且不会抛出任何错误。

0
相关文章