Ceci :
dbms_output.put_line(sql_str);
... est ce qui imprime la sortie, ce qui est un comportement correct. La partie DECLARE me donne l'impression que vous essayez d'exécuter une fonction anonyme, n'est-ce pas ?
Je n'ai jamais utilisé EXECUTE IMMEDIATELY - seulement ce qui suit :
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 vous souhaitez inclure des variables de liaison dans le SQL dynamique :
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;