`
Virgo_S
  • 浏览: 1138323 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

动态SQL和PL/SQL的EXECUTE选项分析

阅读更多
http://bbs.zdnet.com.cn/archiver/tid-133874.html
EXECUTE IMMEDIATE代替了以前Oracle8i中DBMS_SQL package包.它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块.动态创建和执行SQL语句性能超前,EXECUTE IMMEDIATE的目标在于减小企业费用并获得较高的性能,较之以前它相当容易编码.尽管DBMS_SQL仍然可用,但是推荐使用EXECUTE IMMEDIATE,因为它获的收益在包之上。
使用技巧
  1. EXECUTE IMMEDIATE将不会提交一个DML事务执行,应该显式提交。
  2. 如果通过EXECUTE IMMEDIATE处理DML命令,那么在完成以前需要显式提交或者作为EXECUTE IMMEDIATE自己的一部分. 如果通过EXECUTE IMMEDIATE处理DDL命令,它提交所有以前改变的数据。
  3. 不支持返回多行的查询,这种交互将用临时表来存储记录(参照例子如下)或者用REF cursors.
  4. 当执行SQL语句时,不要用分号,当执行PL/SQL块时,在其尾部用分号。
  5. 在Oracle手册中,未详细覆盖这些功能。下面的例子展示了所有用到Execute immediate的可能方面.希望能给你带来方便。
  6. 对于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比以前可能用到的更容易并且更高效.当意图执行动态语句时,适当地处理异常更加重要.应该关注于捕获所有可能的异常。
补充:
like 's%' 的动态sql语句该如何写?
SQL> create table t(id int , name varchar2(10));
表已创建。
SQL> insert into t values(1 , 'test');
已创建 1 行。
SQL> insert into t values(2 , 'abced');
已创建 1 行。
SQL> commit;
提交完成。
SQL> select * from t where name like 't%';
        ID NAME
---------- ----------
         1 test
SQL> declare
  2  v_string varchar2(100);
  3  v_t t%rowtype ;
  4  begin
  5  v_string:='select * from t where name like ''t%''';
  6  execute immediate v_string into v_t;
  7  dbms_output.put_line(v_t.id||' '||v_t.name) ;
  8  end;
  9  /
1 test
PL/SQL 过程已成功完成。
SQL>


分享到:
评论

相关推荐

    精通Oracle_PL/SQL

    精通Oracle PL/SQL》旨在教授读者写出健壮、高效且易于维护的 PL/SQL代码。全书涵盖了 PL/SQL提供的大量功能,包括高效数据处理、...《精通Oracle PL/SQL》结构清晰,示例丰富,实践性强,适用于 DBA和数据库开发人员。

    动态PL/SQL用法例子

    动态PL/SQL用法例子 begin execute immediate 'create table test_qiu(id number)'; end;

    Oracle Database 12c PL-SQL programming

    Filled with detailed examples and expert strategies from an Oracle ACE, Oracle Database 12c PL/SQL Programming explains how to retrieve and process data, write PL/SQL statements, execute effective ...

    C# 访问Oracle示例+PL/SQL+存储过程+触发器 完整示例 测试可用 易懂

    --PL/SQL基础9 动态SQL declare sql_str varchar2(1000); tid integer:=1; trow producttype%rowtype; begin execute immediate 'create table newTypes(id integer primary key,name nvarchar2(200))'; --create ...

    PL/SQL详解 从入门到精通 英文版

    SQL (PL/SQL) that is stored inside the database when it is compiled. This means that you can then execute the program from inside the database. Why would you want to do that? Because your program will...

    Oracle数据库游标使用大全

    整理的Oracle数据库游标使用大全 ...较好的PL/SQL程序设计是在PL/SQL块中使用象DBMS_SQL这样的内建包或执行EXECUTE IMMEDIATE命令建立动态SQL来执行DDL命令,PL/SQL编译器保证对象引用以及用户的权限。。。。。。

    11g_plsql_user_guide_and_reference.pdf

    The PL/SQL features for 11g Release 1 (11.1) are: ■ Enhancements to Regular Expression Built-In SQL Functions ■ SIMPLE_INTEGER, SIMPLE_FLOAT, and SIMPLE_DOUBLE Data Types ■ CONTINUE Statement ■ ...

    SQL Prompt 4.0, simulate to execute SQL

    You can use this tool to simulate to execute SQL instead of PL-SQL(Oracle) and T-SQL(SQL server). Good SQL practise tool!

    EXECUTE IMMEDIATE用法小结

    动态创建和执行SQL语句性能超前,EXECUTE IMMEDIATE的目标在于减小企业费用并获得较高的性能,较之以前它相当容易编码.尽管DBMS_SQL仍然可用,但是推荐使用EXECUTE IMMEDIATE,因为它获的收益在包之上。 — 使用技巧 ...

    plsqldev13.0.5.1908x32主程序+ v12中文包+keygen.rar

    Debugger "Execute SQL" function did not show a result set for a WITH statement Execution in a Command Window did not immediately enable the Break button Recently used file list did not work correctly ...

    CnPlugin_1.5.4

    Execute in new SQL Window 复制当前窗口选中的SQL语句到新窗口中并执行语句(选中字符串是出现) Generate Word Documentation 导出当前表结构内容至Word文档(选中表名出现) 无菜单功能 快捷键输入功能:如...

    SQL21日自学通

    静态SQL 与动态SQL277 使用SQL 来编程279 总结280 问与答280 校练场280 练习281 第14 天动态使用SQL 282 目标282 快速入门282 ODBC 282 Personal Oracle 7283 InterBase SQL ISQL 283 Visual C++ 284 Delphi284 设置...

    SQL普查优化信息汇总

    如果需要在pl/sql 程序中使用动态sql,建议使用execute immediate 对于非常大的表,考虑使用表和索引的分区 如果需要在创建索引的时候减少所需时间,可以在会话集设置比较大的sort_area_size 考虑更多的使用decode...

    精通SQL--结构化查询语言详解

    2.1.3 使用查询分析器执行sql语句 22 2.2 transact-sql 24 2.2.1 transact-sql 概述 24 2.2.2 transact-sql的主要组成 25 2.2.3 transact-sql的一些重要命令 26 2.3 oracle数据库 29 2.3.1 oracle数据库软件...

    数据库基础

    第十二章PL/SQL 块结构和组成元素 235 §12.1 PL/SQL结构 235 §12.2 PL/SQL块 236 §12.3 标识符 236 §12.4 PL/SQL 变量类型 237 §12.4.1 变量类型 237 §12.4.2 复合类型(记录和表) 238 §12.4.3 使用%ROWTYPE...

    精通SQL 结构化查询语言详解

    《精通SQ:结构化查询语言详解》全面讲解SQL语言,提供317个典型应用,读者可以随查随用,针对SQL Server和Oracle进行讲解,很有代表性。 全书共包括大小实例317个,突出了速学速查的特色。《精通SQ:结构化查询语言...

    Oracle8i_9i数据库基础

    第十二章PL/SQL 块结构和组成元素 235 §12.1 PL/SQL结构 235 §12.2 PL/SQL块 236 §12.3 标识符 236 §12.4 PL/SQL 变量类型 237 §12.4.1 变量类型 237 §12.4.2 复合类型(记录和表) 238 §12.4.3 使用%ROWTYPE...

    fos-execute-plsql-code

    概述FOS-执行PL / SQL代码动态操作插件对APEX提供的现有“执行PL / SQL代码”动态操作进行了一些增强。 这些附加功能包括: 提供处理图标,同时可以选择在区域或页面级别上遮罩背景声明式成功与错误通知使用页面项或...

    oracle实验报告

    在PL/SQL块中,可以使用SQL的数据查询命令,数据操纵命令和事务控制命令。可使用全部SQL函数。PL/SQL中的SQL语句,可使用SQL的比较操作等运算符。但不能使用数据定义语句。 在PL/SQL块中使用SELECT语句时注意几点...

    PLSQL Developer 11 中文绿色版

    PL/SQL Developer 11.0 - New Features Below you can find a brief description of the most important new features in PL/SQL Developer 11.0. New features SQL Window enhancements The result set toolbar ...

Global site tag (gtag.js) - Google Analytics