これ:
dbms_output.put_line(sql_str);
...出力を出力しているのは正しい動作です。 DECLAREの部分は、匿名関数を実行しようとしている印象を与えてくれますよね?
EXECUTEIMMEDIATELYを使用したことはありません。次の場合のみです。
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;
動的SQLにバインド変数を含める場合:
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;