sql >> Database >  >> RDS >> PostgreSQL

PL/pgSQL-besturingsstructuren voor lijsten / 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

Belangrijkste punten

  • Oracle's number is numeric in Postgres . Maar als je geen gebroken cijfers hebt, gebruik je liever int of bigint in Postgres. Over typetoewijzing tussen Oracle en Postgres.

  • Postgres heeft geen "tabeltypes" zoals Oracle . Gebruik arraytypen , een array van numeric in dit geval:numeric[] .

  • De uitdrukking IF p_amount_list <> '{}' ... zou zowel NULL als "lege array" uitsluiten. Geen tweede controle nodig zoals in uw origineel. Maar de IF is helemaal niet nodig. Voor NULL of lege array wordt de lus toch niet ingevoerd.

  • r bevat het element zelf, geen index ervoor. (Daarom moet het een overeenkomend gegevenstype zijn.)

Dit demonstreert de basissyntaxis van een FOREACH loop in een plpgsql-functie. Anders zou het dure onzin zijn , beter vervangen door een veel eenvoudiger en sneller:

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



  1. PHP PDO:Hoe om te gaan met bindValue() en gereserveerde trefwoorden?

  2. FOUT:Kan rij 0, col -1 van CursorWindow niet lezen. Zorg ervoor dat de cursor correct is geïnitialiseerd voordat u toegang krijgt tot gegevens

  3. Hoe de laatste record van elk uur van een dag te selecteren

  4. Kies uit niets in Oracle zonder te verwijzen naar de dubbele tabel?