Estoy tratando de devolver múltiples registros usando el tipo de datos RECORD, ¿hay alguna manera de poder agregar a RECORD y agregar / agregar un nuevo valor con cada iteración a este RECORD?
es decir, quiero agregar para rec
que se rec
convierta en un conjunto de filas cuando finalice el ciclo, que simplemente puedo VOLVER al final de mi función. Actualmente, estoy haciendo esto:
SELECT temp_table.col1, temp_table.col2, temp_table.col3
INTO rec
FROM temp_table
WHERE temp_table.col3 = false;
mi código completo está aquí:
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;
Salida de corriente después SELECT validation();
validation
(crea_ddf,8095,f)
Salida deseada
validation
(crea_ddf,8095,f)
(some_source_system,some_count,f)
(some_other_source_system,some_count,f)
(.....)
postgresql
plpgsql
postgresql-9.5
hky404
fuente
fuente
Respuestas:
La función necesita devolver un en
SETOF RECORD
lugar deRECORD
y tener unoRETURN NEXT
por fila en lugar de uno soloRETURN
, como en:Llamador:
Tenga en cuenta que SQL está fuertemente y estáticamente tipado, el
RECORD
pseudo-tipo es difícil de trabajar.A menudo es menos engorroso usar desde el principio un tipo compuesto con una definición completa de nombres y tipos para cada columna, ya sea con la
TABLE(...)
sintaxis para un tipo anónimo o conCREATE TYPE
un tipo con nombre persistente.fuente
Use
setof record
yreturn next rec
si desea devolver múltiples registros de una función, por ejemplo:Dicha función debe llamarse en la cláusula FROM con una lista de definición de columna:
Una mejor opción es usar
returns table(...)
yreturn query
:Uso:
fuente
Esta es una bandera roja..
validation
.staging
.temp_table.col3
IS FALSO la devuelve al usuarioSolo haz esto ...
Incluso puedes poner eso en un
VIEW
si quieresComo nota al margen
¿Qué hace
DISTINCT
aquí? Solo haz LIMIT uno. De hecho, diría que esto es aún más limpio.Entonces no necesitas lo raro
= false ) = FALSE
fuente