Este:
dbms_output.put_line(sql_str);
...é o que está imprimindo a saída, que é o comportamento correto. A parte DECLARE me dá a impressão de que você está tentando executar uma função anônima, correto?
Eu nunca usei EXECUTE IMEDIATAMENTE - apenas o seguinte:
FUNCTION MY_FUNCTION()
RETURN SYS_REFCURSOR
L_CURSOR SYS_REFCURSOR;
L_QUERY VARCHAR2(5000) DEFAULT 'SELECT ...';
BEGIN
OPEN L_CURSOR FOR L_QUERY;
RETURN L_CURSOR;
END;
Se você quiser incluir variáveis de ligação no SQL dinâmico:
FUNCTION MY_FUNCTION()
RETURN SYS_REFCURSOR
L_CURSOR SYS_REFCURSOR;
L_QUERY VARCHAR2(5000) DEFAULT 'SELECT ...';
BEGIN
OPEN L_CURSOR FOR L_QUERY
USING bind_var1;
RETURN L_CURSOR;
END;