PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie deklariere ich ein Array von Zeilentypen in einer PostgreSQL-Funktion?

CREATE OR REPLACE FUNCTION for_example()
  RETURNS integer AS
$func$
DECLARE
   r "WEBHOST";
   b "WEBHOST"[];         -- this works
BEGIN
   FOR r IN 
      SELECT * FROM "WEBHOST"
   LOOP
      b := b || r;        -- this, too
   END LOOP;

   RAISE NOTICE '%', b;   -- get feedback
   RETURN 33;
END
$func$  LANGUAGE plpgsql; -- and lose the quotes

%rowtype ist im Allgemeinen nicht erforderlich. Normalerweise steht der zugehörige Zeilentyp einer Tabelle als gleichnamiger Typ zur Verfügung.

Und nicht geben Sie den Namen der Sprache an.

Und Sie können nicht einfach eigenständige Funktionsaufrufe in plpgsql haben . Stattdessen eine Zuweisung verwenden.

Es ist auch keine gute Idee, CaMeL-Case-Identifikatoren in Postgres zu verwenden. Verwenden Sie legale Kennungen in Kleinbuchstaben, um Ihr Leben einfacher zu machen.

Das Beste zum Schluss :Dies kann viel einfacher mit der Aggregatfunktion array_agg() :

CREATE OR REPLACE FUNCTION for_example()
  RETURNS integer AS
$func$
DECLARE
   b "WEBHOST"[];
BEGIN
   SELECT array_agg(tbl) INTO b FROM "WEBHOST" tbl;       

   RAISE NOTICE '%', b;
   RETURN 33;
END
$func$  LANGUAGE plpgsql;