PostgreSQL - Escrevendo SQL dinâmico no procedimento armazenado que retorna um conjunto de resultados
Como posso escrever um procedimento armazenado que contém uma instrução SQL construída dinamicamente que retorna um conjunto de resultados? Aqui está o meu código de exemplo:
CREATE OR REPLACE FUNCTION reporting.report_get_countries_new (
starts_with varchar,
ends_with varchar
)
RETURNS TABLE (
country_id integer,
country_name varchar
) AS
$body$
DECLARE
starts_with ALIAS FOR $1;
ends_with ALIAS FOR $2;
sql VARCHAR;
BEGIN
sql = 'SELECT * FROM lookups.countries WHERE lookups.countries.country_name >= ' || starts_with ;
IF ends_with IS NOT NULL THEN
sql = sql || ' AND lookups.countries.country_name <= ' || ends_with ;
END IF;
RETURN QUERY EXECUTE sql;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100 ROWS 1000;
Este código retorna um erro:
ERROR: syntax error at or near "RETURN"
LINE 1: RETURN QUERY SELECT * FROM omnipay_lookups.countries WHERE o...
^
QUERY: RETURN QUERY SELECT * FROM omnipay_lookups.countries WHERE omnipay_lookups.countries.country_name >= r
CONTEXT: PL/pgSQL function "report_get_countries_new" line 14 at EXECUTE statement
Eu tentei outras maneiras em vez disso:
RETURN QUERY EXECUTE sql;
Caminho 1:
RETURN EXECUTE sql;
Caminho 2:
sql = 'RETURN QUERY SELECT * FROM....
/*later*/
EXECUTE sql;
Em todos os casos sem sucesso.
Por fim, quero escrever um procedimento armazenado que contenha uma instrução sql dinâmica e que retorne o conjunto de resultados da instrução sql dinâmica.