sql >> Databasteknik >  >> RDS >> PostgreSQL

PL/pgSQL-kontrollstrukturer för listor/matriser

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

Huvudpunkter

  • Oracles number är numeric i Postgres . Men om du inte har bråksiffror använder du hellre int eller bigint i Postgres. Om typmappning mellan Oracle och Postgres.

  • Postgres har inte "tabelltyper" som Oracle . Använd arraytyper , en matris med numeric i det här fallet:numeric[] .

  • Uttrycket IF p_amount_list <> '{}' ... skulle utesluta NULL och "tom array" likadant. Inget behov av en andra kontroll som i ditt original. Men IF behövs inte alls. För NULL eller tom array läggs slingan inte in i alla fall.

  • r innehåller själva elementet, inte ett index för det. (Därför måste det vara en matchande datatyp.)

Detta visar grundläggande syntax för en FOREACH loop i en plpgsql-funktion. Annars vore det dyrt nonsens , bättre att ersätta med en mycket enklare och snabbare:

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



  1. Bootstrappa SQL Express från WiX?

  2. Null Pointer Undantag vid anrop av getReadableDatabase()

  3. Infoga data i Postgresql med dubbletter av värden

  4. Hur Acos() fungerar i PostgreSQL