被PLOSCAR函数使用

用PLOSCAR语言定义的过程也可以被另一个PLOSCAR函数调用。被调用的PLOSCAR函数参数的数据类型可以是一般标量类型和ROWTYPE类型,不能是集合(SET)或记录(RECORD)类型。对于OUT或INOUT型参数仅支持标量类型参数。

被PLOSCAR函数调用的PLOSCAR函数只会把返回值返回给上层函数。 OUT/INOUT型参数对上层函数变量的修改会体现在上层过程以后对该变量的引用中。

示例1:被PLOSCAR函数使用

--  清理环境
DROP FUNCTION add_one(INT);
DROP FUNCTION add_one_in_assign(INT, INT  );

create or replace function add_one(i int) 
    return int as
BEGIN
    return i + 1;
END;

/

select add_one(10);
ADD_ONE(int)      |
------------------
11                |
总数目:1

-- call add_one() in assign stmt
create or replace function add_one_in_assign(i int, j int) 
    return int as
DECLARE
    ret int;
BEGIN
    ret := i + add_one(i) + add_one(j);
    return ret;
END;

/

select add_one_in_assign(1, 10);
ADD_ONE_IN_ASSIGN(int)      |
----------------------------
14                          |
总数目:1

--删除过程
DROP FUNCTION add_one(INT);
DROP FUNCTION add_one_in_assign(INT, INT  );

函数调用出现在过程体中的位置可以有以下几种:

  • 赋值语句的expression部分
  • PERFORM语句的query部分
  • EXECUTE语句的query_string字符串部分
  • SELECT INTO语句的expressions中
  • 一般的SQL语句中(如INSERT/UPDATE/DELETE,不包括SELECT)
  • RETURN语句和RETURN NEXT的expression部分
  • IF语句、EXIT WHEN语句以及WHILE语句的boolean_expression部分
  • 表示整数FOR循环上下边界的expression部分
  • FOR-IN语句的select_query部分
  • FOR-IN-EXECUTE语句的text_expression字符串中
  • 游标的定义语句中
  • PLOSCAR函数可以递归的调用自身。(这里通过一个计算阶乘的例子来说明)

示例2:计算阶乘

--  清理环境
DROP FUNCTION count_factorial(INT);

create or replace function count_factorial(i int) 
    return int as
declare
    res int;
    temp int;
begin
    if i > 0 then
        res := count_factorial(i - 1);
        res := i * res;
    else
        res := 1;
    end if;
    return res;
end;

/
select count_factorial(7);
COUNT_FACTORIAL(int)      |
--------------------------
5040                      |
总数目:1

--删除过程
DROP FUNCTION count_factorial(INT);