Това:
dbms_output.put_line(sql_str);
... е това, което отпечатва изхода, което е правилно поведение. Частта DECLARE ми създава впечатлението, че се опитвате да стартирате анонимна функция, нали?
Никога не съм използвал EXECUTE IMMEDIATELY - само следното:
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;