Я пытаюсь вернуть несколько записей, используя тип данных RECORD, есть ли способ, которым я могу добавить к RECORD и добавить / добавить новое значение с каждой итерации к этой записи.
то есть, я хочу добавить к нему, rec
чтобы он rec
стал набором строк после завершения цикла, который я могу просто ВЕРНУТЬ в конце своей функции. В настоящее время я делаю это -
SELECT temp_table.col1, temp_table.col2, temp_table.col3
INTO rec
FROM temp_table
WHERE temp_table.col3 = false;
мой полный код здесь:
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;
Токовый выход после SELECT validation();
validation
(crea_ddf,8095,f)
Желаемый вывод
validation
(crea_ddf,8095,f)
(some_source_system,some_count,f)
(some_other_source_system,some_count,f)
(.....)
postgresql
plpgsql
postgresql-9.5
hky404
источник
источник
Ответы:
Функция должна возвращать
SETOF RECORD
вместоRECORD
и иметь по одномуRETURN NEXT
в строке вместо одногоRETURN
, как в:Абонент:
Обратите внимание, что SQL строго и статически типизирован, с
RECORD
псевдотипом трудно работать.Часто с самого начала менее сложно использовать составной тип с полным определением имен и типов для каждого столбца, либо с
TABLE(...)
синтаксисом для анонимного типа, либо с помощьюCREATE TYPE
для постоянного именованного типа.источник
Используйте
setof record
и,return next rec
если вы хотите вернуть несколько записей из функции, например:Такая функция должна вызываться в предложении FROM со списком определений столбцов:
Лучшим вариантом является использование
returns table(...)
иreturn query
:Использование:
источник
Это красный флаг ..
validation
.staging
.temp_table.col3
IS FALSE вы возвращаете пользователюПросто сделай это ..
Вы можете даже поместить это в,
VIEW
если хотитеКак примечание стороны
Что
DISTINCT
здесь делать? Просто сделайте LIMIT один. На самом деле, я бы сказал, что это даже чище.Тогда вам не нужно странное
= false ) = FALSE
источник