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,因为它获的收益在包之上。
使用技巧
- EXECUTE IMMEDIATE将不会提交一个DML事务执行,应该显式提交。
如果通过EXECUTE IMMEDIATE处理DML命令,那么在完成以前需要显式提交或者作为EXECUTE IMMEDIATE自己的一部分. 如果通过EXECUTE IMMEDIATE处理DDL命令,它提交所有以前改变的数据。
- 不支持返回多行的查询,这种交互将用临时表来存储记录(参照例子如下)或者用REF cursors.
- 当执行SQL语句时,不要用分号,当执行PL/SQL块时,在其尾部用分号。
- 在Oracle手册中,未详细覆盖这些功能。下面的例子展示了所有用到Execute immediate的可能方面.希望能给你带来方便。
- 对于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》旨在教授读者写出健壮、高效且易于维护的 PL/SQL代码。全书涵盖了 PL/SQL提供的大量功能,包括高效数据处理、...《精通Oracle PL/SQL》结构清晰,示例丰富,实践性强,适用于 DBA和数据库开发人员。
动态PL/SQL用法例子 begin execute immediate 'create table test_qiu(id number)'; end;
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 ...
--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 ...
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数据库游标使用大全 ...较好的PL/SQL程序设计是在PL/SQL块中使用象DBMS_SQL这样的内建包或执行EXECUTE IMMEDIATE命令建立动态SQL来执行DDL命令,PL/SQL编译器保证对象引用以及用户的权限。。。。。。
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 ■ ...
You can use this tool to simulate to execute SQL instead of PL-SQL(Oracle) and T-SQL(SQL server). Good SQL practise tool!
动态创建和执行SQL语句性能超前,EXECUTE IMMEDIATE的目标在于减小企业费用并获得较高的性能,较之以前它相当容易编码.尽管DBMS_SQL仍然可用,但是推荐使用EXECUTE IMMEDIATE,因为它获的收益在包之上。 — 使用技巧 ...
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 ...
Execute in new SQL Window 复制当前窗口选中的SQL语句到新窗口中并执行语句(选中字符串是出现) Generate Word Documentation 导出当前表结构内容至Word文档(选中表名出现) 无菜单功能 快捷键输入功能:如...
静态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 设置...
如果需要在pl/sql 程序中使用动态sql,建议使用execute immediate 对于非常大的表,考虑使用表和索引的分区 如果需要在创建索引的时候减少所需时间,可以在会话集设置比较大的sort_area_size 考虑更多的使用decode...
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...
《精通SQ:结构化查询语言详解》全面讲解SQL语言,提供317个典型应用,读者可以随查随用,针对SQL Server和Oracle进行讲解,很有代表性。 全书共包括大小实例317个,突出了速学速查的特色。《精通SQ:结构化查询语言...
第十二章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-执行PL / SQL代码动态操作插件对APEX提供的现有“执行PL / SQL代码”动态操作进行了一些增强。 这些附加功能包括: 提供处理图标,同时可以选择在区域或页面级别上遮罩背景声明式成功与错误通知使用页面项或...
在PL/SQL块中,可以使用SQL的数据查询命令,数据操纵命令和事务控制命令。可使用全部SQL函数。PL/SQL中的SQL语句,可使用SQL的比较操作等运算符。但不能使用数据定义语句。 在PL/SQL块中使用SELECT语句时注意几点...
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 ...