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

PL/pgSQL kontrolstrukturer til lister/arrays

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

Vigtige punkter

  • Oracles number er numeric i Postgres . Men hvis du ikke har brøktal, vil du hellere bruge int eller bigint i Postgres. Om typekortlægning mellem Oracle og Postgres.

  • Postgres har ikke "tabeltyper" som Oracle . Brug arraytyper , en matrix af numeric i dette tilfælde:numeric[] .

  • Udtrykket IF p_amount_list <> '{}' ... ville udelukke NULL og "tom array" ens. Intet behov for en ekstra kontrol som i din original. Men IF er slet ikke nødvendig. For NULL eller tom matrix indtastes løkken alligevel ikke.

  • r indeholder selve elementet, ikke et indeks til det. (Derfor skal det være en matchende datatype.)

Dette viser den grundlæggende syntaks for en FOREACH loop i en plpgsql-funktion. Ellers ville det være dyrt sludder , bedre erstattet med en meget enklere og hurtigere:

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



  1. Hvordan bruger man en procent (%) i et LIKE uden at det bliver behandlet som et jokertegn?

  2. Masseindlæg fra csv i postgres ved hjælp af golang uden brug af for loop

  3. Hvilke måder er der til at gemme oplysninger om en anonym/gæstebruger i en database?

  4. Oracle SQL:Hvordan returnerer flere forskellige kolonner