sql >> Databáze >  >> RDS >> PostgreSQL

Řídicí struktury PL/pgSQL pro seznamy / pole

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

Hlavní body

  • number společnosti Oracle je numeric v Postgres . Ale pokud nemáte desetinné číslice, raději použijte int nebo bigint v Postgresu. O mapování typů mezi Oracle a Postgres.

  • Postgres nemá "typy tabulek" jako Oracle . Použijte typy polí , pole numeric v tomto případě:numeric[] .

  • Výraz IF p_amount_list <> '{}' ... by vyloučil NULL a "prázdné pole". Není potřeba druhá kontrola jako u vašeho originálu. Ale IF není vůbec potřeba. Pro NULL nebo prázdné pole se smyčka stejně nezadává.

  • r obsahuje samotný prvek, nikoli jeho index. (Musí se tedy jednat o odpovídající datový typ.)

Toto ukazuje základní syntaxi FOREACH smyčka ve funkci plpgsql. Jinak by to byl drahý nesmysl , lepší nahradit mnohem jednodušším a rychlejším:

SELECT sum(elem) AS sum_amount
FROM   unnest(p_amount_list) elem;



  1. Dotaz Mysql zkontrolujte typ sloupce blob v klauzuli where

  2. Jak formátovat čísla s úvodními nulami v SQLite

  3. php:import více souborů csv do tabulky mysql

  4. Oracle:Dynamický SQL