0

是否可以在 Postgres 中使用类似的东西?这是我想要做的 PL/SQL 的示例:

PROCEDURE CREATE_PAYMENT(P_AMOUNT IN NUMBER,
                         P_INVOICE_LIST IN SIMPLEARRAYTYPE, 
                         P_AMOUNT_LIST IN NUMBER_TABLE -- pass list of amounts
                            .
                            .
                            .)

s_chk_amnt              NUMBER;

invoice_list SIMPLEARRAYTYPE;
amount_list NUMBER_TABLE;

BEGIN
      -- check if amount list is null or contains zeros
    IF p_amount_list IS NOT NULL AND p_amount_list.COUNT <> 0 THEN
      FOR r IN p_amount_list.FIRST..p_amount_list.LAST
      LOOP
        s_chk_amnt := s_chk_amnt + p_amount_list(r);
      END LOOP;
    END IF;

我可以将字符列表和数字列表声明为函数输入参数吗?
我找到了一些示例,FOREACH element但我不知道如何从数字列表中获取某个元素,例如 Oracle 中的p_amount_list(r).

4

1 回答 1

1
CREATE OR REPLACE FUNCTION CREATE_PAYMENT(p_amount_list numeric[])
  RETURNS numeric AS
$func$
DECLARE
   s_chk_amnt numeric := 0; -- init variable!
   r          numeric;
BEGIN
-- IF p_amount_list <> '{}' THEN  -- just noise
   FOREACH r IN ARRAY p_amount_list
   LOOP
      s_chk_amnt := s_chk_amnt + r;
   END LOOP;
-- END IF;

RETURN s_chk_amnt;
END
$func$ LANGUAGE plpgsql

要点

  • OraclenumbernumericPostgres 中。但如果你没有小数位,你宁愿在 Postgres 中使用intor 。关于 Oracle 和 Postgres 之间的类型映射。bigint

  • Postgres 没有像 Oracle 这样的“表类型”。使用数组类型numeric在这种情况下是一个数组:numeric[]

  • 该表达式IF p_amount_list <> '{}' ...将排除 NULL 和“空数组”之类的。无需像原来的那样进行第二次检查。但IF根本不需要。对于 NULL 或空数组,无论如何都不会进入循环。

  • r保存元素本身,而不是它的索引。(因此它必须是匹配的数据类型。)

这将演示FOREACHplpgsql 函数中循环的基本语法。否则这将是昂贵的废话,最好用更简单和更快的方法代替:

SELECT sum(elem) AS sum_amount
FROM   unnest(p_amount_list) elem;
于 2014-12-31T03:22:42.713 回答