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

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

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

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

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

5. 对于Forms开发者,当在PL/SQL 8.0.6.3.版本中,Forms 6i不能使用此功能。 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) := '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比以前可能用到的更容易并且更高效.当意图执行动态语句时,适当地处理异常更加重要.应该关注于捕获所有可能的异常。

动态SQL和PL/SQL的EXECUTE选项分析的更多相关文章

  1. SQL with PL/SQL

    DDL commands --> create user / table / view / sequence alter DML --> data manipulation languag ...

  2. SQL和PL/SQL的区别

    SQL和PL/SQL的区别 1. SQL是结构化查询语言,比较接近自然语言,使用SQL,只需要说干什么,不需要说怎么干.由数据定义语言.数据操纵语言.数据控制语言构成,它不面向过程,即前一条语句与后一 ...

  3. PL\SQL和PL/SQL Developer 12安装与配置

    安装: (1)在已有安装包的情况下,直接将安装包解压到文件夹下,注意不要解压缩到c:\programs Files(x86)的文件夹下,不能解压缩到有中文文件夹命名的文件夹下面 (2)没有安装包的情况 ...

  4. [PL/SQL]使用PL/SQL实现ORACLE的Excel格式导入导出

    注:教程所使用的PL/SQL Developer版本为10版本 1.oracle导出excel格式 第一步,在pl/sql窗口查询出你想要导出的数据. 第二步,选择你想导出的数据,然后右键" ...

  5. SQL、PL/SQL、DDL、DML、TCL介绍

    SQL:结构化查询语言(Structured Query Language) PL/SQL:过程化SQL语言(Procedural Language/SQL) DDL(Data Definition ...

  6. 【PL/SQL编程】SQL与PL/SQL的区别

    SQL概念: SQL是结构化查询语言,由数据定义语言.数据操纵语言.数据控制语言构成,它不面向过程,即前一条语句与后一条语句无关.它没有流程控制,也不存在变量. PL SQL概念:    PL/SQL ...

  7. PL/SQL不能格式化SQL:--PL/SQL Beautifier could not parse text

    PL/SQL sql语句美化器点击没有反应.查看下面提示PL/SQL Beautifier could not parse text.本人此次产生的原因是sql语句语法错误. 工具栏处(如果没有此按钮 ...

  8. Oracle 和pl/sql以及pl/sql developer

    oracle是厂家的名字,也是数据库产品的名字.比如sybase公司的sybase数据库.而微软公司的数据库产品就叫sqlserver了. pl/sql 是oracle数据库所用的sql语言的名称.微 ...

  9. PL/SQL --> 动态SQL调用包中函数或过程

    动态SQL主要是用于针对不同的条件或查询任务来生成不同的SQL语句.最常用的方法是直接使用EXECUTE IMMEDIATE来执行动态SQL语句字符串或字符串变量.但是对于系统自定义的包或用户自定的包 ...

随机推荐

  1. supervisor "INFO spawnerr: unknown error making dispatchers for xxx" 错误

    查看 supervisor 的配置中,是否有受限的文件路径,如果有,则需要修改对应文件的权限

  2. [postfix]转发邮件设置

    http://stackoverflow.com/questions/22537523/postfix-recipient-bcc-maps-multiple-recipients-how-to ht ...

  3. CSS边框及常用样式

    一.CSS设置样式 1.1 边框border 作用:设置标签周围的边框,方法  board:宽度 样式 颜色,一般情况下样式使用 solid实体的,和dotted虚线的 <head> &l ...

  4. Nginx+Tomcat+Memcache实现负载均衡及Session共享

    第一部分 环境介绍 部署环境: Host1:Nginx.Memcached.Tomcat1 Host2:Tomcat2 Tomcat_version:8.0.38 第二部分 Nginx+Tomcat实 ...

  5. solr基础使用概述

    概述:solr 作为搜索引擎系统,它应该包含两部分内容,分别是:索引系统 和 搜索系统. 索引系统 它主要负责将外部不同数据源的数据转换为 solr 格式规范的数据格式(我们称之为:SolrInput ...

  6. P4711 「化学」相对分子质量

    P4711 「化学」相对分子质量 给你一个字符串让你输出相对分子质量(弱智字符串模拟) 我比赛tm调了两个半小时啊QAQ 希望以后能增加代码力吧,纪念挂代码 Code #include<iost ...

  7. 科学计算三维可视化---Traits(Event和button属性)

    Event和button属性 是两个专门用于处理事件的change属性 Event属性和其他Trait属性不一样 Button属性是由Event属性继承而来的 Event监听 from traits. ...

  8. linux之top命令详解

    top:动态查看进程变化,监控linux的系统状况. top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器. 下面详细介绍它的使用方法 ...

  9. 对 jQuery 中 data 方法的误解

    一直以来都认为新版本中 data 是调用 dataset 实现的,对于低版本IE则采用 getAttribute其实一直是我误解了,也不知道最初这个想法是怎么来的.难道我被盗梦了? 今天 谢亮 兄弟和 ...

  10. elasticsearch-head插件安装说明

    下载及安装readme https://github.com/mobz/elasticsearch-head 安装: npm install npm run start 访问:http://local ...