zoukankan      html  css  js  c++  java
  • execute immediate 的作用。

     execute immediate v_sql into v_count;   ----

    使用技巧

    1. EXECUTE IMMEDIATE将不会提交一个DML事务执行,应该在完成前显式提交或者作为EXECUTE IMMEDIATE自己的一部分.           如通过EXECUTE IMMEDIATE处理DDL命令,它提交所有以前改变的数据

    2. 不支持返回多行的查询,这种交互将用临时表来存储记录(参照例子如下)或者用REF cursors.

    3. 当执行SQL语句时,不要用分号,当执行PL/SQL块时,在其尾部用分号.

    4. 在Oracle手册中,未具体覆盖这些功能。下面的例子展示了所有用到Execute immediate的可能方面.希望能给你带来方便.

    EXECUTE IMMEDIATE用法例子

    1. 在PL/SQL运行DDL语句

    begin

       execute immediate ′set role all′;

     end;

    2. 给动态语句传值(USING 子句)

    declare

       l_depnam varchar2(20) := 'testing';

       l_loc    varchar2(10) := 'Dubai';

     begin

       execute immediate 'insert

         into dept values(:1, :2, :3)'

         using 50, l_depnam, l_loc;

       commit;

     end;

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

    declare

       l_cnt varchar2(20);

     begin

       execute immediate 'select count(1) from emp'

         into l_cnt;

       dbms_output.put_line(l_cnt);

     end;

    4. 动态调用例程.例程中用到的绑定变量参数必须指定参数类型.黓以为IN类型,其它类型必须显式指定

    declare

       l_routin varchar2(100) := 'gen.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));

       v_empdtl empdtlrec;

     begin

       execute immediate 'select empno, ename, deptno ' ||

                         'from emp where empno = 7934'

         into v_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比以前可能用到的更轻易并且更高效.当意图执行动态语句时,适当地处理异常更加重要.应该关注于捕捉所有可能的异常.

    dml :Data Manipulation Language 数据操纵语言 包括 insert update delete select (插入,修改,删除,检索)。

    dcl:Data Control Language 数据库控制语言 如grant,deny,revoke等,只有管理员才有这样的权限。

    ddl: Data Definition Language 数据库定义语言,是用于描写数据库中现实世界实体的语言   最多的是create database ,create table,drop...

  • 相关阅读:
    windows的80端口被占用时的处理方法
    Ansible自动化运维工具安装与使用实例
    Tomcat的测试网页换成自己项目首页
    LeetCode 219. Contains Duplicate II
    LeetCode Contest 177
    LeetCode 217. Contains Duplicate
    LeetCode 216. Combination Sum III(DFS)
    LeetCode 215. Kth Largest Element in an Array(排序)
    Contest 176 LeetCode 1354. Construct Target Array With Multiple Sums(优先队列,递推)
    Contest 176
  • 原文地址:https://www.cnblogs.com/javawebstudy/p/2922313.html
Copyright © 2011-2022 走看看