Próbuję zwrócić wiele rekordów przy użyciu typu danych RECORD, czy istnieje sposób, aby dołączyć do RECORD i dodawać / dodawać nową wartość z każdą iteracją do tego rekordu.
to znaczy, chcę dołączyć do rec
tak, że rec
staje się zestawem wierszy po zakończeniu pętli, które mogę po prostu POWRÓT na końcu mojej funkcji. Obecnie robię to -
SELECT temp_table.col1, temp_table.col2, temp_table.col3
INTO rec
FROM temp_table
WHERE temp_table.col3 = false;
mój pełny kod jest tutaj:
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;
Wyjście prądowe po SELECT validation();
validation
(crea_ddf,8095,f)
Pożądane wyjście
validation
(crea_ddf,8095,f)
(some_source_system,some_count,f)
(some_other_source_system,some_count,f)
(.....)
postgresql
plpgsql
postgresql-9.5
hky404
źródło
źródło
Odpowiedzi:
Funkcja musi zwrócić
SETOF RECORD
zamiastRECORD
i mieć jedenRETURN NEXT
na wiersz zamiast jednegoRETURN
, jak w:Gość:
Zauważ, że SQL jest silnie i statycznie typowany, więc
RECORD
pseudo-typ jest trudny do pracy.Często mniej kłopotliwe jest stosowanie od samego początku typu złożonego z pełną definicją nazw i typów dla każdej kolumny, ze
TABLE(...)
składnią dla typu anonimowego lub zCREATE TYPE
trwałym nazwanym typem.źródło
Użyj
setof record
ireturn next rec
jeśli chcesz zwrócić wiele rekordów z funkcji, przykład:Taką funkcję należy wywołać w klauzuli FROM z listą definicji kolumn:
Lepszą opcją jest użycie
returns table(...)
ireturn query
:Stosowanie:
źródło
To jest czerwona flaga ..
validation
.staging
.temp_table.col3
IS FALSE zwracane są do użytkownikaPo prostu zrób to ...
Możesz nawet to umieścić,
VIEW
jeśli chceszNa marginesie
Co
DISTINCT
tu robi? Po prostu zrób LIMIT jeden. W rzeczywistości argumentowałbym, że jest to jeszcze czystsze.Więc nie potrzebujesz dziwnego
= false ) = FALSE
źródło