sql >> Databasteknik >  >> RDS >> PostgreSQL

Få resultat från fråga i DO-satsen

Du kan inte returnera värden från en DO påstående. Skapa en plpgsql-funktion istället.

Det finns flera sätt att definiera returtypen med RETURNING sats eller med OUT parametrar. Läs manualen om CREATE FUNCTION .

Det finns flera sätt att returnera värden från funktionen. Läs kapitlet Återvända från en funktion i manualen.

I synnerhet, eftersom du försöker returnera hela rader från en tabell, kan du använda den registrerade typen av tabellen för funktionsdeklarationen:

CREATE FUNCTION foo ()
  RETURNING SETOF test_log 
$func$
BEGIN

IF 'a' = 'a' THEN
  RETURN QUERY
  SELECT * FROM test_log LIMIT 10;
ELSE
   RAISE WARNING $$Didn't work!$$;
END IF;

END
$func$ LANGUAGE plpgsql;

Ring:

SELECT * FROM foo ();

Eller prova en sökning här på SO. Jag har lagt upp många relaterade kodexempel .

Lösning för DO uttalande

Om du inte kan använda en funktion är den enda halvvägs vettiga lösningen med en DO-sats att använda en tillfällig tabell:

CREATE TEMP TABLE tbl_tmp AS
SELECT * FROM test_log LIMIT 0;

$do$
BEGIN

IF 'a' = 'a' THEN
  INSERT INTO tbl_tmp
  SELECT * FROM test_log LIMIT 10;
ELSE
   RAISE WARNING $$Didn't work!$$;
END IF;

END
$do$ LANGUAGE plpgsql;

SELECT * FROM tbl_tmp;

Tillfälliga tabeller tas bort automatiskt i slutet av sessionen .



  1. Undviker knee-Jerk prestanda felsökning

  2. Kodtäckning för PL/SQL

  3. Skicka ett formulär med 50 fält till flera tabeller; vanlig POST, AJAX POST eller annat?

  4. PostgreSQL + Hibernate + Spring automatiskt skapa databas