服务器 频道

PL/pgSQL控制结构

IT168 服务器学院】    控制结构可能是 PL/pgSQL 中最有用的(以及最重要)的部分了。 利用 PL/pgSQL 的控制结构, 你可以以非常灵活而且强大的方法操纵 PostgreSQL 的数据。

     从函数返回

有两个命令可以用来从函数中返回数据:RETURN 和 RETURN NEXT。

     RETURN

RETURN expression;
    带表达式的 RETURN 是用于终止函数, 然后 expression 的值返回给调用者。

    如果返回标量类型,那么可以使用任何表达式。表达式的类型将被自动转换成函数的返回类型, 就像我们在赋值中描述的那样。 要返回一个复合(行)数值,你必须写一个记录或者行变量做 expression。

    一个函数的返回值不能是未定义。如果控制到达了函数的最顶层的块而没有碰到一个 RETURN 语句, 那么它就会发生一个错误。

    请注意如果你声明了该函数返回 void,那么仍然必须声明 RETURN 语句;但是,跟在 RETURN 后面的表达式是可选的,并且在任何情况下都会被忽略。

    RETURN NEXT

RETURN NEXT expression;
     如果一个 PL/pgSQL 函数声明为返回 SETOF sometype, 那么遵循的过程则略有不同。在这种情况下,要返回的独立的项是在 RETURN NEXT 命令里声明的,然后最后有一个不带参数的 RETURN 命令用于告诉我们这个函数已经完成执行了。 RETURN NEXT 可以用于标量和复合数据类型;对于后者,将返回一个完整的结果"表"。

    使用 RETURN NEXT 的函数应该按照下面的风格调用:

SELECT * FROM some_func();
    也就是说,这个函数是用做FROM子句里面的一个表数据源的。

    RETURN NEXT 实际上并不从函数中返回; 它只是简单地把表达式的值保存起来。 然后执行继续执行 PL/pgSQL 函数里的下一条语句。 随着后继的 RETURN NEXT 命令的执行, 结果集就建立起来了。最后的一个不需要参数的 RETURN, 导致控制退出该函数。

    注意: 目前的 PL/pgSQL 的 RETURN NEXT 实现在从函数返回之前把整个结果集都保存起来,就象上面描述的那样。 这意味着如果一个 PL/pgSQL 函数生成一个非常大的结果集, 性能可能会很差:数据将被写到磁盘上以避免内存耗尽, 但是函数在完成整个结果集的生成之前不会退出。将来的 PL/pgSQL 版本可能会允许用户定义没有这样限制的返回集合的函数。 目前,数据开始向磁盘里写的时刻是由配置变量 work_mem 控制的。 拥有足够内存的管理员如果想在内存里存储更大的结果集, 则可以考虑把这个参数增大一些。

    条件
   
    IF 语句让你可以根据某种条件执行命令。 PL/pgSQL有五种形式的IF:

IF ... THEN

IF ... THEN ... ELSE

IF ... THEN ... ELSE IF

IF ... THEN ... ELSIF ... THEN ... ELSE

IF ... THEN ... ELSEIF ... THEN ... ELSE


    IF-THEN

IF boolean-expression THEN
    statements
END IF;
    IF-THEN语句是IF的最简单形式。如果条件为真, 在THEN和END IF之间的语句将被执行。 否则,将忽略它们。

例子:

IF v_user_id <> 0 THEN
    UPDATE users SET email = v_email WHERE user_id = v_user_id;
END IF;

    IF-THEN-ELSE
IF boolean-expression THEN
    statements
ELSE
    statements
END IF;
    IF-THEN-ELSE语句增加了IF-THEN的分支, 让你可以声明在条件计算结果为假的时候执行的语句。

例子:

IF parentid IS NULL OR parentid = ''''
THEN
    RETURN fullname;
ELSE
    RETURN hp_true_filename(parentid) || ''/'' || fullname;
END IF;

IF v_count > 0 THEN
    INSERT INTO users_count(count) VALUES(v_count);
    RETURN ''t'';
ELSE
    RETURN ''f'';
END IF;

    IF-THEN-ELSE IF

    IF语句可以嵌套并且在下面的例子中:

IF demo_row.sex = ''m'' THEN
  pretty_sex := ''man'';
ELSE
  IF demo_row.sex = ''f'' THEN
    pretty_sex := ''woman'';
  END IF;
END IF;

    如果你使用这种形式,那么你实际上就是在另外一个IF语句的ELSE 部分嵌套了一个IF语句.因此你需要一个END IF语句 给每个嵌套的IF,另外还要一个给父IF-ELSE用. 这么干是可以的,但是如果我们有太多候选项需要检查,那么就会变得很乏味. 因此有下面的形式。

    IF-THEN-ELSIF-ELSE

IF boolean-expression THEN
    statements
[ ELSIF boolean-expression THEN
    statements
[ ELSIF boolean-expression THEN
    statements
    ...]]
[ ELSE
    statements ]
END IF;
IF-THEN-ELSIF-ELSE提供了一种更方便的方法用于在一条语句中检查许多候选条件。 形式上它和嵌套的IF-THEN-ELSE-IF-THEN命令相同, 但是只需要一个END IF。

这里是一个例子:

IF number = 0 THEN
    result := ''zero'';
ELSIF number > 0 THEN
    result := ''positive'';
ELSIF number < 0 THEN
    result := ''negative'';
ELSE
    -- 另外一个唯一的可能是它是空值
    result := ''NULL'';
END IF;

    IF-THEN-ELSEIF-ELSE

ELSEIF 是 ELSIF 的别名。

0
相关文章