Ich versuche, mehrere Datensätze mit dem Datentyp RECORD zurückzugeben. Gibt es eine Möglichkeit, an RECORD anzuhängen und mit jeder Iteration einen neuen Wert zu diesem RECORD hinzuzufügen / anzuhängen?
Das heißt, ich möchte anhängen, rec
damit nach rec
Ablauf der Schleife eine Reihe von Zeilen entsteht, die ich am Ende meiner Funktion einfach zurückgeben kann. Derzeit mache ich das -
SELECT temp_table.col1, temp_table.col2, temp_table.col3
INTO rec
FROM temp_table
WHERE temp_table.col3 = false;
Mein vollständiger Code ist hier:
CREATE OR REPLACE FUNCTION validation()
RETURNS RECORD AS $$
DECLARE
rec RECORD;
temp_row RECORD;
BEGIN
CREATE TEMPORARY TABLE temp_table (col1 TEXT, col2 INTEGER, col3 BOOLEAN) ON COMMIT DROP;
FOR temp_row IN SELECT * FROM staging.validation
LOOP
RAISE NOTICE 'sql: %', temp_row.sql;
EXECUTE format('INSERT INTO temp_table %s', temp_row.sql);
IF (SELECT DISTINCT temp_table.col3 FROM temp_table WHERE temp_table.col3 = false)=false THEN
RAISE NOTICE 'there is a false value';
SELECT temp_table.col1, temp_table.col2, temp_table.col3
INTO rec
FROM temp_table
WHERE temp_table.col3 = false;
END IF;
END LOOP;
RETURN rec;
END; $$
LANGUAGE plpgsql;
Stromausgang nach SELECT validation();
validation
(crea_ddf,8095,f)
Gewünschte Ausgabe
validation
(crea_ddf,8095,f)
(some_source_system,some_count,f)
(some_other_source_system,some_count,f)
(.....)
postgresql
plpgsql
postgresql-9.5
hky404
quelle
quelle
Antworten:
Die Funktion muss ein
SETOF RECORD
anstelle vonRECORD
und einRETURN NEXT
pro Zeile anstelle eines einzelnen zurückgebenRETURN
, wie in:Anrufer:
Beachten Sie, dass SQL stark und statisch typisiert
RECORD
ist und es schwierig ist, mit dem Pseudotyp zu arbeiten.Oft ist es weniger umständlich, von Anfang an einen zusammengesetzten Typ mit einer vollständigen Definition von Namen und Typ für jede Spalte zu verwenden, entweder mit der
TABLE(...)
Syntax für einen anonymen Typ oder mitCREATE TYPE
für einen dauerhaften benannten Typ.quelle
Verwenden Sie
setof record
und,return next rec
wenn Sie mehrere Datensätze von einer Funktion zurückgeben möchten, Beispiel:Eine solche Funktion muss in der FROM-Klausel mit einer Spaltendefinitionsliste aufgerufen werden:
Eine bessere Option ist zu verwenden
returns table(...)
undreturn query
:Verwendung:
quelle
Dies ist eine rote Fahne ..
validation
.staging
.temp_table.col3
IS FALSE geben Sie an den Benutzer zurückMach das einfach ..
Sie können das sogar in ein setzen,
VIEW
wenn Sie wollenAls Randnotiz
Was macht
DISTINCT
hier? Mach einfach LIMIT eins. In der Tat würde ich argumentieren, dass dies noch sauberer ist.Dann brauchst du das Seltsame nicht
= false ) = FALSE
quelle