我是个ORACLE初学者,我是FUNCTION中编写了一个函数,函数的功能是返回一个动态SQL语句,现在问题是怎样才能在存储过程中调用这个函数呢,有代码麻烦给参考下,谢谢。
------解决方案--------------------
- SQL code
CREATE OR REPLACE FUNCTION get_sql(p_table VARCHAR2) RETURN VARCHAR2 ISl_str VARCHAR2(1000);BEGIN l_str:='select ename from '||p_table; RETURN l_str;END;/CREATE OR REPLACE PROCEDURE proc_test(p_table VARCHAR2) ISl_str VARCHAR2(1000);BEGIN l_str:=get_sql(p_table); dbms_output.put_line(l_str);END;/BEGIN proc_test('scott.emp');END;/
------解决方案--------------------
- SQL code
SQL> create or replace function f1 2 return nvarchar2 3 is 4 begin 5 return 'select * from a'; 6 end; 7 /Function createdSQL> SQL> create or replace procedure p1 2 as 3 strsql nvarchar2(200); 4 begin 5 select f1 into strsql from dual; 6 dbms_output.put_line(strsql); 7 end; 8 /Procedure createdSQL> set serveroutput on;SQL> exec p1;select * from aPL/SQL procedure successfully completedSQL>
------解决方案--------------------
- SQL code
CREATE OR REPLACE FUNCTION get_sql(p_table VARCHAR2) RETURN VARCHAR2 ISl_str VARCHAR2(1000);BEGIN l_str:='select ename from '||p_table; RETURN l_str;END;/CREATE OR REPLACE PROCEDURE proc_test(p_table VARCHAR2,p_out OUT Sys_Refcursor) ISl_str VARCHAR2(1000);BEGIN l_str:=get_sql(p_table); dbms_output.put_line(l_str); OPEN p_out FOR l_str;END;/DECLARE l_c SYS_REFCURSOR; l_v VARCHAR2(100);BEGIN proc_test('scott.emp',l_c); LOOP FETCH l_c INTO l_v; dbms_output.put_line(l_v); EXIT WHEN l_c%NOTFOUND; END LOOP;END;/输出:select ename from scott.empSMITHALLENWARDJONESMARTINBLAKECLARKSCOTTKINGTURNERADAMSJAMESFORDMILLERMILLER