PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Strutture di controllo PL/pgSQL per liste/array

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

Punti principali

  • Il number di Oracle è numeric in Postgres . Ma se non hai cifre frazionarie, preferisci usare int o bigint a Postgres. Informazioni sulla mappatura dei tipi tra Oracle e Postgres.

  • Postgres non ha "tipi di tabelle" come Oracle . Usa tipi di array , un array di numeric in questo caso:numeric[] .

  • L'espressione IF p_amount_list <> '{}' ... escluderebbe allo stesso modo NULL e "array vuoto". Non c'è bisogno di un secondo controllo come nel tuo originale. Ma il IF non è affatto necessario. Per NULL o array vuoto, il ciclo non viene comunque inserito.

  • r contiene l'elemento stesso, non un indice ad esso. (Pertanto deve essere un tipo di dati corrispondente.)

Questo serve a dimostrare la sintassi di base di un FOREACH ciclo in una funzione plpgsql. Altrimenti sarebbe una costosa sciocchezza , meglio sostituito con un molto più semplice e veloce:

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