Questo:
dbms_output.put_line(sql_str);
...è ciò che sta stampando l'output, che è un comportamento corretto. La parte DECLARE mi dà l'impressione che tu stia tentando di eseguire una funzione anonima, giusto?
Non ho mai usato ESEGUI IMMEDIATAMENTE - solo quanto segue:
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 vuoi includere le variabili bind nell'SQL dinamico:
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;