Ini:
dbms_output.put_line(sql_str);
... adalah apa yang mencetak output, yang merupakan perilaku yang benar. Bagian DECLARE memberi saya kesan Anda mencoba menjalankan fungsi anonim, benar?
Saya tidak pernah menggunakan EXECUTE IMMEDIATELY - hanya berikut ini:
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;
Jika Anda ingin memasukkan variabel bind dalam SQL dinamis:
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;