EXECUTE IMMEDIATE的优点及详细用法

EXECUTE IMMEDIATE  用法的定义:

EXECUTE IMMEDIATE将不会提交一个DML事务执行,而是显示提交,如果通过EXECUTE IMMEDIATE来处理DML命令,那么在执行之前需要显示提交或者作为EXECUTE IMMEDIATE自身的一部分,如果通过EXECUTE IMMEDIATE来处理DDL命令,那么它提交的是所有之前改变的数据,EXECUTE IMMEDIATE不支持返回多行的查询。

EXECUTE IMMEDIATE 具体的用法如下:

1)在PL/SQL运行DDL命

         eg.       begin

                              execute immediate 'set  role all';

                     end;

2)给动态语句值传值(using子句)

        eg.       declare

                              var01  varchar2(20) := 'aaa';

                              var02  varchar2(20) := 'bbb';

                     begin

                              execute  immediate 'insert into vartable values (:1, :2, :3)'

                               using 50, var01,  var02;

                     commit;

                     end;

3)从动态语句中检索值(INTO子句)

         eg.       declare

                            varinto varchar2(20);

                            varstring  varchar2(50) := 'select count(*) from emp';

                      begin

                             execute  immediate  varstring  into varinto;

                             dbms_output.putline(varinto);

                      end;

4. 动态调用例程.例程中用到的绑定变量参数必须指定参数类型.
黓认为IN类型,其它类型必须显式指定
declare
   l_routin    varchar2(100) := 'gen2161.get_rowcnt';
   l_tblnam    varchar2(20) := 'emp';
   l_cnt       number;
   l_status    varchar2(200);
begin
   execute immediate 'begin ' || l_routin || '(:2, :3, :4); end;'
     using in l_tblnam, out l_cnt, in out l_status;

   if l_status != 'OK' then
      dbms_output.put_line('error');
   end if;
end;


5. 将返回值传递到PL/SQL记录类型;同样也可用%rowtype变量


declare
   type empdtlrec is record (empno   number(4),
                            ename   varchar2(20),
                            deptno   number(2));
   empdtl empdtlrec;
begin
   execute immediate 'select empno, ename, deptno ' ||
                    'from emp where empno = 7934'
     into empdtl;
end;


6. 传递并检索值.INTO子句用在USING子句前


declare
   l_dept     pls_integer := 20;
   l_nam      varchar2(20);
   l_loc      varchar2(20);
begin
   execute immediate 'select dname, loc from dept where deptno = :1'
     into l_nam, l_loc
     using l_dept ;
end;


7. 多行查询选项.对此选项用insert语句填充临时表,
用临时表进行进一步的处理,也可以用REF cursors纠正此缺憾.

declare
   l_sal    pls_integer := 2000;
begin
   execute immediate 'insert into temp(empno, ename) ' ||
                    '           select empno, ename from emp ' ||
                    '           where   sal > :1'
     using l_sal;
   commit;
end;


  对于处理动态语句,EXECUTE IMMEDIATE 比以前可能用到的更容易并且更高效.
当意图执行动态语句时,适当地处理异常更加重要.应该关注于捕获所有可能的异常.

猜你喜欢

转载自wstcwlr.iteye.com/blog/1654874