Estou tentando retornar vários registros usando o tipo de dados RECORD, existe uma maneira de acrescentar ao RECORD e adicionar / acrescentar um novo valor a cada iteração para este RECORD.
ou seja, desejo anexar para rec
que rec
se torne um conjunto de linhas quando o loop terminar, que eu posso VOLTAR no final da minha função. Atualmente, estou fazendo isso -
SELECT temp_table.col1, temp_table.col2, temp_table.col3
INTO rec
FROM temp_table
WHERE temp_table.col3 = false;
meu código completo está aqui:
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;
Saída atual após SELECT validation();
validation
(crea_ddf,8095,f)
Saída desejada
validation
(crea_ddf,8095,f)
(some_source_system,some_count,f)
(some_other_source_system,some_count,f)
(.....)
postgresql
plpgsql
postgresql-9.5
hky404
fonte
fonte
Respostas:
A função precisa retornar um em
SETOF RECORD
vez deRECORD
e ter umRETURN NEXT
por linha em vez de um únicoRETURN
, como em:Chamador:
Observe que o SQL é forte e estático,
RECORD
e é difícil trabalhar com o pseudo-tipo.Muitas vezes, é menos complicado usar desde o início um tipo composto com uma definição completa de nomes e tipos para cada coluna, seja com a
TABLE(...)
sintaxe de um tipo anônimo ou comCREATE TYPE
um tipo de nome persistente.fonte
Use
setof record
ereturn next rec
se desejar retornar vários registros de uma função, exemplo:Essa função precisa ser chamada na cláusula FROM com uma lista de definições de coluna:
Uma opção melhor é usar
returns table(...)
ereturn query
:Uso:
fonte
Esta é uma bandeira vermelha ..
validation
.staging
.temp_table.col3
IS FALSE retornam ao usuárioApenas faça isso ..
Você pode até colocar isso em um
VIEW
se quiserComo uma nota rodapé
O que
DISTINCT
aqui faz? Apenas limite um. Na verdade, eu argumentaria que isso é ainda mais limpo.Então você não precisa do estranho
= false ) = FALSE
fonte