CREATE OR REPLACE PROCEDURE dyn_getproc
(
v_p_login_id NUMBER,
v_p_usr_id NUMBER,
v_p_role_id NUMBER,
v_p_org_id NUMBER,
v_proc_name IN VARCHAR2 DEFAULT NULL,--动态调用流程名
v_param IN VARCHAR2 DEFAULT NULL,--存储过程的参数字符串,例如-1,-1,'','',-1,2,'',-1,-1,-1,-1
cv_1 IN OUT SYS_REFCURSOR,
cv_2 IN OUT SYS_REFCURSOR
)AS
BEGIN
DECLARE
v_errorcode NUMBER;
v_errormsg VARCHAR2(1000);
v_sqlstr VARCHAR2(4000);
v_sqlpar VARCHAR2(4000);
v_cv_1 SYS_REFCURSOR;--存储过程中调用存储过程的游标参数变量
v_cv_2 SYS_REFCURSOR;--存储过程中调用存储过程的游标参数变量
BEGIN
v_errorcode := -1;
v_errormsg := '未知错误。';
v_sqlstr := 'BEGIN '||
v_proc_name || '('
|| cast(v_p_login_id as varchar) || ','
|| cast(v_p_usr_id as varchar) || ','
|| cast(v_p_role_id as varchar) || ','
|| cast(v_p_org_id as varchar) || ','
|| v_param || ','
|| ':cv_1, :cv_2);end; ';
EXECUTE IMMEDIATE v_sqlstr --将要动态调用的存储过程拼成字符串
USING in OUT cv_1,in out cv_2;--设置v_sqlstr中参数:cv_1与:cv_2
/* LOOP
FETCH v_cv_2 INTO v_errorcode,v_errormsg;
EXIT WHEN v_cv_2%NOTFOUND;
dbms_output.put_line(v_errorcode||v_errormsg);
END LOOP;
open cv_2 for select v_errorcode as errorcode,v_errormsg as errormsg from dual;*/
EXCEPTION
WHEN OTHERS THEN
BEGIN
v_errorcode := -10001;
v_errormsg := '调用存储过程异常!'|| v_sqlstr || SQLERRM;
open cv_2 for select v_errorcode as errorcode, v_errormsg as errormsg from dual;
END;
END;
END;