esto:
dbms_output.put_line(sql_str);
... es lo que está imprimiendo la salida, que es el comportamiento correcto. La parte DECLARE me da la impresión de que está intentando ejecutar una función anónima, ¿correcto?
Nunca he usado EJECUTAR INMEDIATAMENTE, solo lo siguiente:
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;
Si desea incluir variables de vinculación en el 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;