J'essaie de renvoyer plusieurs enregistrements en utilisant le type de données RECORD, est-il possible d'ajouter à RECORD et d'ajouter / ajouter une nouvelle valeur à chaque itération à ce RECORD.
c'est-à-dire que je veux ajouter à rec
ce qui rec
devient un ensemble de lignes lorsque la boucle est terminée, que je peux simplement retourner à la fin de ma fonction. Actuellement, je fais cela -
SELECT temp_table.col1, temp_table.col2, temp_table.col3
INTO rec
FROM temp_table
WHERE temp_table.col3 = false;
mon code complet est ici:
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;
Sortie courant après SELECT validation();
validation
(crea_ddf,8095,f)
Sortie désirée
validation
(crea_ddf,8095,f)
(some_source_system,some_count,f)
(some_other_source_system,some_count,f)
(.....)
postgresql
plpgsql
postgresql-9.5
hky404
la source
la source
Réponses:
La fonction doit renvoyer un
SETOF RECORD
au lieu deRECORD
et en avoir unRETURN NEXT
par ligne au lieu d'un seulRETURN
, comme dans:Votre interlocuteur:
Notez que SQL étant fortement et statiquement typé, le
RECORD
pseudo-type est difficile à travailler.Souvent, il est moins lourd d'utiliser dès le départ un type composite avec une définition complète des noms et du type pour chaque colonne, soit avec la
TABLE(...)
syntaxe d'un type anonyme, soit avecCREATE TYPE
un type nommé persistant.la source
Utilisez
setof record
etreturn next rec
si vous souhaitez renvoyer plusieurs enregistrements d'une fonction, par exemple:Une telle fonction doit être appelée dans la clause FROM avec une liste de définitions de colonnes:
Une meilleure option consiste à utiliser
returns table(...)
etreturn query
:Usage:
la source
Ceci est un drapeau rouge ..
validation
.staging
.temp_table.col3
IS FALSE que vous renvoyez à l'utilisateurFaites juste ça ..
Vous pouvez même mettre ça dans un
VIEW
si vous voulezEn note
Que fait
DISTINCT
ici? Il suffit d'en limiter un. En fait, je dirais que c'est encore plus propre.Alors tu n'as pas besoin de l'étrange
= false ) = FALSE
la source