Bootstrap

oracle动态语句事务,oracle 动态SQL execute immediate

execute immediate的语法如下:

execute immediate 'sql';

execute immediate 'sql_select' into var_1, var_2;

execute immediate 'sql' using [in|out|in out] bind_var_1, [in|out|in out] bind_var_2;

execute immediate 'sql_select' into var_1, var_2 using [in|out|in out] bind_var_1, [in|out|in out] bind_var_2;

execute immediate 'sql' returning into var_1;

execute immediate 'sql' bulk collect into indexed_var;

当我们碰到有一类存储名称和过程的参数上都相似时,可以使用execute immediate来动态执行这些存储过程,在这次的项目中我有一类用“P_InsertInto_”开头的存储过程,后面是表名如:P_InsertInto_AC01、P_InsertInto_AC02等等,用来给AC01、AC02........这些表插入数据的,我们就只能用execute immediate动态执行这些过程,像这样速度和代码编写上就会方便很多了。

这个方法整整研究了一大半天,不容易啊,呵呵。。。。,最终还是成功了!

我对execute immediate的用法的理解用一个实例说明一下,有一个存储过程名为:p_test,它有三个参数,分别为:两个输入参数和一个输出参数,实现过程如:

declare

v_sql varchar2(1000);

c varchar2(1000);

a varchar2(1) :='1';

b number :=1;

begin

--当然动态存储过程可以在这实现了,直接放到v_sql这个变量中就可以了(在这里是一个指定的过程p_test)

v_sql:='begin p_test(:v1,:v2,:v3); end;';

execute immediate v_sql using in '1',in '2',out c;

--或execute immediate v_sql using '1', '2',out c;

dbms_output.put_line(c);

end;

上面我们就实现了动态传递参数和动态存储过程的调用方法。值得注意的是:默认为in,in可省,out不可省!

还有一个值得注意的地方就是:每一个动态(execute immediate)执行的方法都有自己的begin.........end;包住才行呀,如果有多个就这样写:

--第一个

begin

v_sql:='begin p_test1(:v1,:v2,:v3); end;';

execute immediate v_sql using in '1',in '2',out c;

--或execute immediate v_sql using '1', '2',out c;

dbms_output.put_line(c);

end;

--第二个

begin

v_sql:='begin p_test2(:v1,:v2,:v3); end;';

execute immediate v_sql using in '1',in '2',out c;

--或execute immediate v_sql using '1', '2',out c;

dbms_output.put_line(c);

end;

。。。。。。。

--第N个

begin

--

end;

EXECUTE IMMEDIATE代替了以前Oracle8i中DBMS_SQL package包.它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块.动态创建和执行SQL语句性能超前,EXECUTE IMMEDIATE的目标在于减小企业费用并获得较高的性能,较之以前它相当容易编码.尽管DBMS_SQL仍然可用,但是推荐使用EXECUTE IMMEDIATE,因为它获的收益在包之上。

使用技巧

1. EXECUTE IMMEDIATE将不会提交一个DML事务执行,应该显式提交

如果通过EXECUTE IMMEDIATE处理DML命令,那么在完成以前需要显式提交或者作为EXECUTE IMMEDI

;