PostgreSQL - Escribiendo sql dinámico en un procedimiento almacenado que devuelve un conjunto de resultados

¿Cómo puedo escribir un procedimiento almacenado que contenga una instrucción SQL generada dinámicamente que devuelva un conjunto de resultados? Aquí está mi código de muestra:

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 devuelve un error:

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

He intentado otras maneras en lugar de esto:

RETURN QUERY EXECUTE sql;

Camino 1:

RETURN EXECUTE sql;

Camino 2:

sql = 'RETURN QUERY SELECT * FROM....
/*later*/
EXECUTE sql;

En todos los casos sin éxito.

En última instancia, quiero escribir un procedimiento almacenado que contenga una instrucción sql dinámica y que devuelva el conjunto de resultados de la instrucción sql dinámica.

Respuestas a la pregunta(2)

Su respuesta a la pregunta