SQL> create procedure p_temp as 2 begin 3 dbms_output.put_line('Procedure is executed!'); 4 end; 5 /过程已创建。 SQL> create or replace procedure p_1(v_pname varchar2) as 2 3 begin 4 execute immediate ' 5 begin 6 '||v_pname||';' 7 ||' end;'; 8 end; 9 /过程已创建。SQL> exec p_1('p_temp'); Procedure is executed!PL/SQL 过程已成功完成。SQL>
我测试的过程中发现必须使用begin ... end 才可以 SQL> create or replace procedure p_1(v_pname varchar2) as 2 3 begin 4 execute immediate v_pname; 5 end; 6 /过程已创建。SQL> exec p_1('p_temp'); BEGIN p_1('p_temp'); END;* ERROR 位于第 1 行: ORA-00900: 无效 SQL 语句 ORA-06512: 在"SCOTT.P_1", line 4 ORA-06512: 在line 1 SQL>
动态sql.将要调用的传到一串字符串中去.
create procedure v_temp as v_sql varchar2; begin v_sql:='你要用的存储过程名及参数'; dbms_output.put_line(v_sql); exectude immediate v_sql; end v_temp;
create or replace procedure p_1(v_pname varchar2) as retstr varchar2(100); begin execute immediate ' begin '||v_pname||'('||retstr||'); end;'; dbms_output.put_line(retstr); end; /
在写execute immediate的时候用如下方式: execute immediate 'begin proc_name(:para1,:para2) end;' using para1 in para1_value,para2 out para2_value; 其中:para1是输入变量,para2是输出变量
2 begin
3 dbms_output.put_line('Procedure is executed!');
4 end;
5 /过程已创建。
SQL> create or replace procedure p_1(v_pname varchar2) as
2
3 begin
4 execute immediate '
5 begin
6 '||v_pname||';'
7 ||' end;';
8 end;
9 /过程已创建。SQL> exec p_1('p_temp');
Procedure is executed!PL/SQL 过程已成功完成。SQL>
SQL> create or replace procedure p_1(v_pname varchar2) as
2
3 begin
4 execute immediate v_pname;
5 end;
6 /过程已创建。SQL> exec p_1('p_temp');
BEGIN p_1('p_temp'); END;*
ERROR 位于第 1 行:
ORA-00900: 无效 SQL 语句
ORA-06512: 在"SCOTT.P_1", line 4
ORA-06512: 在line 1
SQL>
v_sql varchar2;
begin
v_sql:='你要用的存储过程名及参数';
dbms_output.put_line(v_sql);
exectude immediate v_sql;
end v_temp;
retstr varchar2(100);
begin
execute immediate ' begin '||v_pname||'('||retstr||'); end;';
dbms_output.put_line(retstr);
end;
/
execute immediate 'begin proc_name(:para1,:para2) end;' using
para1 in para1_value,para2 out para2_value;
其中:para1是输入变量,para2是输出变量
exec :var||(parm);
--如果保存过程名的变量为var:
:var||(parm);