PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Struktury kontrolne PL/pgSQL dla list / tablic

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

Główne punkty

  • number Oracle jest numeric w Postgresie . Ale jeśli nie masz cyfr ułamkowych, wolisz użyć int lub bigint w Postgresie. Informacje o mapowaniu typów między Oracle i Postgres.

  • Postgres nie ma "typów tabel", takich jak Oracle . Użyj typów tablic , tablica numeric w tym przypadku:numeric[] .

  • Wyrażenie IF p_amount_list <> '{}' ... wykluczyłoby zarówno NULL, jak i „pustą tablicę”. Nie ma potrzeby ponownego sprawdzania, jak w oryginale. Ale IF w ogóle nie jest potrzebna. W przypadku tablicy NULL lub pustej pętla i tak nie jest wprowadzana.

  • r przechowuje sam element, a nie indeks do niego. (Dlatego musi to być zgodny typ danych.)

To pokazuje podstawową składnię FOREACH pętla w funkcji plpgsql. W przeciwnym razie byłby to kosztowny nonsens , lepiej zastąpić znacznie prostszym i szybszym:

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zaktualizuj wartość kolumny PostgreSQL

  2. Jak połączyć wszystkie wyniki z wiersza tabeli?

  3. różnica między localhost i postgres dla hosta w docker

  4. SELECT zgłasza wyjątek w funkcji PL/pgSQL

  5. AWS Glue - Obcinanie docelowej tabeli postgres przed wstawieniem