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.

questionAnswers(2)

yourAnswerToTheQuestion