我需要以一种不返回记录类型的方式重写此函数。原因是我需要使用它来创建一个视图。
CREATE OR REPLACE FUNCTION conta_relatos(IN _fator_normativo integer, IN _fator_determinativo integer, OUT rel_pri integer, OUT rel_sec integer, OUT rel_ref integer)
RETURNS record AS
$BODY$
DECLARE
tipo_relato text;
BEGIN
rel_pri := 0;
rel_sec := 0;
rel_ref := 0;
FOR tipo_relato IN
SELECT f."Tipo_Relato"
FROM "Vinculos" v
INNER JOIN ("Fontes" f INNER JOIN "Itens" i ON f."ID" = i."Fonte") ON v."Item" = i."ID"
WHERE v."Fator_Normativo" = _fator_normativo
AND v."Fator_Determinativo" = _fator_determinativo
LOOP
CASE tipo_relato
WHEN '1 - Relato Primário' THEN
rel_pri := rel_pri + 1;
WHEN '2 - Relato Secundário' THEN
rel_sec := rel_sec + 1;
WHEN '3 - Relato Referencial' THEN
rel_ref := rel_ref + 1;
END CASE;
END LOOP;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
该函数必须返回3 int
列:rel_pri
,rel_sec
,rel_ref
答案 0 :(得分:2)
您可以使用返回复合类型(记录/行)的函数使查询工作,而不需要更改它。
我误解了preceding question中的错误消息,并在那里更新了我的答案。
当我们讨论重写函数的主题时,可以将其重写为SQL语句(如mentioned before):
SELECT COUNT (f."Tipo_Relato" = '1 - Relato Primário' OR NULL) AS rel_pri
,COUNT (f."Tipo_Relato" = '2 - Relato Secundário' OR NULL) AS rel_sec
,COUNT (f."Tipo_Relato" = '3 - Relato Referencial' OR NULL) AS rel_ref
FROM "Vinculos" v
JOIN "Itens" i ON i."ID" = v."Item"
JOIN "Fontes" f ON f."ID" = i."Fonte"
WHERE v."Fator_Normativo" = _fator_normativo
AND v."Fator_Determinativo" = _fator_determinativo;
要使其成为现有函数的 drop-in替换,您可以将其包装到 SQL函数中,这可能比您现在的速度快一点:
CREATE OR REPLACE FUNCTION conta_relatos(
_fator_normativo integer
,_fator_determinativo integer
,OUT rel_pri integer
,OUT rel_sec integer
,OUT rel_ref integer) AS
$func$
SELECT COUNT (f."Tipo_Relato" = '1 - Relato Primário' OR NULL) -- rel_pri
,COUNT (f."Tipo_Relato" = '2 - Relato Secundário' OR NULL) -- rel_sec
,COUNT (f."Tipo_Relato" = '3 - Relato Referencial' OR NULL) -- rel_ref
FROM "Vinculos" v
JOIN "Itens" i ON i."ID" = v."Item"
JOIN "Fontes" f ON f."ID" = i."Fonte"
WHERE v."Fator_Normativo" = _fator_normativo
AND v."Fator_Determinativo" = _fator_determinativo
$func$ LANGUAGE sql;