zoukankan      html  css  js  c++  java
  • 如何使用动态SQL

    EXECUTE IMMEDIATE解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块。它的动态创建和执行 SQL语句性能超前。

    使用技巧

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

      假如通过EXECUTE IMMEDIATE处理DML命令,那么在完成以前需要显式提交或者作为EXECUTE IMMEDIATE自己的一部分。假如通过EXECUTE IMMEDIATE处理DDL命令,它提交所有以前改变的数据。

    2、 EXECUTE IMMEDIATE不支持返回多行的查询,这种交互将用临时表来存储记录或者用REF 游标。

    3、当执行SQL语句时,后面不要加分号,当执行PL/SQL块时,需要在其尾部用分号。

    4、下面的例子展示了可能用到的Execute immediate的几个方面,希望能够在开发中为你带来方便。

    EXECUTE IMMEDIATE用法例子

    1、在PL/SQL运行DDL语句

      begin

      execute immediate 'set role all';

      end;

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

      declare

      l_depnam varchar2(20) := 'testing';

      l_locvarchar2(10) := 'Dubai';

      begin

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

      using 50, l_depnam, l_loc;

      commit;

      end;

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

      declare

      l_cntvarchar2(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) := 'gen2161.get_rowcnt';

      l_tblnam varchar2(20) := 'emp';

      l_cntnumber;

      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 (empnonumber(4),

      enamevarchar2(20),

      deptnonumber(2));

      empdtl empdtlrec;

      begin

      execute immediate 'select empno, ename, deptno '

      'from emp where empno = 7934'

      into empdtl;

      end;

    6、传递并检索值

            INTO子句应当用在USING子句之前

    declare

      l_deptpls_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 '

      'wheresal :1'

      using l_sal;

      commit;

      end;

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

  • 相关阅读:
    [Luogu P3626] [APIO2009] 会议中心
    杭电 1869 六度分离 (求每两个节点间的距离)
    杭电 1874 畅通工程续 (求某节点到某节点的最短路径)
    最短路径模板
    杭电 2544 最短路径
    POJ 1287 Networking (最小生成树模板题)
    NYOJ 1875 畅通工程再续 (无节点间距离求最小生成树)
    POJ 2485 Highways (求最小生成树中最大的边)
    杭电 1233 还是畅通工程 (最小生成树)
    杭电 1863 畅通工程 (最小生成树)
  • 原文地址:https://www.cnblogs.com/HondaHsu/p/2608514.html
Copyright © 2011-2022 走看看