`

动态SQL和PLSQL的EXECUTE IMMEDIATE选项

阅读更多

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

 


转自:http://wenku.baidu.com/view/6dfdff4e767f5acfa1c7cde9.html

分享到:
评论

相关推荐

    oracle动态sql之EXECUTE IMMEDIATE.docx

    在上面的示例中,我们使用 EXECUTE IMMEDIATE 语句来执行动态 SQL 语句,包括动态 DDL、动态 DML insert 和动态 DML select。这些示例展示了 EXECUTE IMMEDIATE 语句的使用方法和灵活性,使得开发者可以根据需要灵活...

    execute immediate 用法研究

    execute immediate 用法研究 ...Execute Immediate 是一个功能强大且灵活的语句,可以满足各种动态 SQL 语句和 PL/SQL 块的需求。但是,也需要注意使用技巧和限制,以确保正确和高效地使用 Execute Immediate。

    动态PL/SQL用法例子

    根据给定的信息,本文将详细解释动态PL/SQL的相关知识点,包括动态SQL的基本概念、如何使用`EXECUTE IMMEDIATE`语句创建表、插入数据以及查询数据等。 ### 动态SQL简介 在PL/SQL中,动态SQL指的是运行时才能确定其...

    PLSQL开发过程中,动态使用DBMS_SQL[借鉴].pdf

    PLSQL开发过程中动态使用DBMS_SQL 在 PL/SQL 开发过程中,使用 SQL、PL/SQL 可以实现大部分的需求,但是在某些特殊的情况下,在 PL/SQL 中使用标准的 SQL 语句或 DML 语句不能实现自己的需求,比如需要动态建表或...

    Oracle_PLSQL.rar_Java plsql_oracle_oracle doc_pl sql_plsql

    - **动态SQL**:通过EXECUTE IMMEDIATE语句执行字符串形式的SQL,适应更灵活的需求。 3. **PL/SQL控制结构** - **条件判断**:IF-THEN-ELSIF-ELSE语句用于根据条件执行不同的代码路径。 - **循环**:WHILE、FOR...

    PLSQL.rar_SQLServer pls_plsql_plsql sqlserver

    例如,可以使用`INTO`子句将查询结果插入到变量中,或使用`EXECUTE IMMEDIATE`动态执行SQL。 7. **事务管理**: PLSQL支持事务的概念,可以使用`COMMIT`提交事务,`ROLLBACK`回滚事务,以确保数据的一致性和完整性...

    oracle sql & plsql

    - **动态SQL**: 使用EXECUTE IMMEDIATE执行动态构建的SQL语句。 #### 十一、综合练习 - 结合前面学习的内容,设计并实现具体的练习案例,加强理解和应用能力。 #### 十二、模拟项目 - 通过实际项目的实施,将所学...

    oracle执行动态sql

    在 Oracle 中,`EXECUTE IMMEDIATE` 是一种常用的执行动态 SQL 的方式。下面通过几个示例来具体说明: 1. **执行 DML 语句** ```plsql DECLARE n_deptno NUMBER := 20; BEGIN EXECUTE IMMEDIATE 'SELECT ...

    整理:oracle pl/sql 入门+ 数组使用+游标+动态SQL

    - EXECUTE IMMEDIATE:使用此命令执行字符串形式的SQL语句。 - INTO子句:用于将动态查询的结果赋值给变量。 - 游标FOR LOOP:与动态SQL结合,可以方便地遍历和处理动态查询结果。 在实际开发中,掌握这些基本...

    oracle动态过程执行

    ### Oracle 动态 SQL 执行详解 在 Oracle 数据库中,动态 SQL ...通过使用 `EXECUTE IMMEDIATE` 或者 DBMS_SQL 包,我们可以轻松地构建和执行动态 SQL 语句。然而,在实际应用中也需要谨慎考虑其性能和安全性问题。

    Oracle PL SQL专家指南_高级PLSQL解决方案的设计与开发

    - 动态SQL:EXECUTE IMMEDIATE和DBMS_SQL包 - 游标表达式和游标变量的高级应用 - PL/SQL包和类型:创建和使用 - PL/SQL中的对象关系编程 10. **AppendixA - 实战案例与解决方案** - 解决实际问题的PL/SQL代码...

    Oracle PlSql 存储过程

    Oracle PlSql 存储过程详解 Oracle PlSql 存储过程是 Oracle 数据库中的一种编程语言,用于实现复杂的业务逻辑和数据处理。...本地动态 SQL 可以使用 EXECUTE IMMEDIATE 语句来执行,并可以使用绑定变量来提高性能。

    PLSQL及oracle的SQL语句

    6. **动态SQL**:使用EXECUTE IMMEDIATE和PREPARE-EXECUTE-CLOSE组合来执行动态构建的SQL语句。 7. **包**:如何创建和使用包来组织相关的PLSQL代码,提高代码复用性和模块化。 总之,PLSQL与Oracle SQL结合使用,...

    Oracle PLSQL实例精解(英文原书第4版)

    书中会解释如何使用EXECUTE IMMEDIATE语句以及绑定变量来实现动态SQL,同时强调了安全性和性能优化的重要性。 书中还会涉及PL/SQL中的事务管理,包括COMMIT、ROLLBACK和SAVEPOINT操作。掌握事务管理对于保证数据...

    PLSQL 个人自学总结

    例如,我们可以通过BEGIN...END块来组织代码,通过EXECUTE IMMEDIATE动态执行SQL语句。 3. 异常处理部分: PLSQL提供了一个强大的异常处理机制,允许我们预定义或自定义异常,并在发生错误时进行相应的处理。异常...

    PLSQL7.1经典版本

    例如,通过EXECUTE IMMEDIATE语句动态执行SQL语句,或者通过CURSOR声明和处理结果集。 5. **子程序**:PLSQL支持创建存储过程、函数和包,这些子程序可以封装复杂的业务逻辑,提高代码复用性和可维护性。存储过程不...

    Oracle PLSQL详解 宝典

    6. **动态SQL**:掌握如何在PL/SQL中执行动态SQL语句,使用EXECUTE IMMEDIATE和DBMS_SQL包。 7. **事务控制**:理解事务的概念,学习提交、回滚和保存点操作,以及如何控制事务的隔离级别。 8. **包**:学习创建和...

    PLSQL最新中文手册

    8. **动态SQL**:通过EXECUTE IMMEDIATE语句,可以在PLSQL中执行字符串形式的SQL,增强了灵活性,常用于处理不确定的查询结构。 9. **游标变量**:游标变量是PLSQL中的一种特殊类型,用于存储游标对象,可以在程序...

    PLSQL Developer

    - **动态SQL**:通过EXECUTE IMMEDIATE语句,可以在运行时动态执行SQL,增强灵活性。 - **PL/SQL记录类型和集合类型**:自定义数据类型,提高代码复用性和模块化。 4. **最佳实践** - 遵循良好的编程规范,如...

Global site tag (gtag.js) - Google Analytics