动态SQL和PL/SQL的EXECUTE选项分析
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语句
EXECUTE IMMEDIATE 'set role all';
END;
2. 给动态语句传值(USING 子句)
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子句)
l_cnt VARCHAR2(20);
BEGIN
EXECUTE IMMEDIATE 'select count(1) from emp' into l_cnt;
dbms_output.put_line(l_cnt);
END;
4. 动态调用例程.例程中用到的绑定变量参数必须指定参数类型.黓认为IN类型,其它类型必须显式指定。
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变量。
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子句前。
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纠正此缺憾。
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选项分析的更多相关文章
- SQL with PL/SQL
DDL commands --> create user / table / view / sequence alter DML --> data manipulation languag ...
- SQL和PL/SQL的区别
SQL和PL/SQL的区别 1. SQL是结构化查询语言,比较接近自然语言,使用SQL,只需要说干什么,不需要说怎么干.由数据定义语言.数据操纵语言.数据控制语言构成,它不面向过程,即前一条语句与后一 ...
- PL\SQL和PL/SQL Developer 12安装与配置
安装: (1)在已有安装包的情况下,直接将安装包解压到文件夹下,注意不要解压缩到c:\programs Files(x86)的文件夹下,不能解压缩到有中文文件夹命名的文件夹下面 (2)没有安装包的情况 ...
- [PL/SQL]使用PL/SQL实现ORACLE的Excel格式导入导出
注:教程所使用的PL/SQL Developer版本为10版本 1.oracle导出excel格式 第一步,在pl/sql窗口查询出你想要导出的数据. 第二步,选择你想导出的数据,然后右键" ...
- SQL、PL/SQL、DDL、DML、TCL介绍
SQL:结构化查询语言(Structured Query Language) PL/SQL:过程化SQL语言(Procedural Language/SQL) DDL(Data Definition ...
- 【PL/SQL编程】SQL与PL/SQL的区别
SQL概念: SQL是结构化查询语言,由数据定义语言.数据操纵语言.数据控制语言构成,它不面向过程,即前一条语句与后一条语句无关.它没有流程控制,也不存在变量. PL SQL概念: PL/SQL ...
- PL/SQL不能格式化SQL:--PL/SQL Beautifier could not parse text
PL/SQL sql语句美化器点击没有反应.查看下面提示PL/SQL Beautifier could not parse text.本人此次产生的原因是sql语句语法错误. 工具栏处(如果没有此按钮 ...
- Oracle 和pl/sql以及pl/sql developer
oracle是厂家的名字,也是数据库产品的名字.比如sybase公司的sybase数据库.而微软公司的数据库产品就叫sqlserver了. pl/sql 是oracle数据库所用的sql语言的名称.微 ...
- PL/SQL --> 动态SQL调用包中函数或过程
动态SQL主要是用于针对不同的条件或查询任务来生成不同的SQL语句.最常用的方法是直接使用EXECUTE IMMEDIATE来执行动态SQL语句字符串或字符串变量.但是对于系统自定义的包或用户自定的包 ...
随机推荐
- SpringMVC 上传文件(文件非必填)MultipartHttpServletRequest
原文:https://blog.csdn.net/dorothy1224/article/details/79136676 上传文件(文件非必填)MultipartHttpServletRequest ...
- 交互式shell脚本对话框----whiptail指令
当你在linux环境下setup软件的时候就会有相应的对话框让你输入.虽然我们已经习惯了这种交互的方法,但是如果有一种直观的界面来输入是不是会更加友好和方便呢,在shell脚本中你可以使用-whipt ...
- ubuntu下访问其他盘出现挂在错误解决办法
Error mounting /dev/sda5 at /media Linux下不能进入windows的NTFS分区之挂载错误问题 电 脑安装了win8,后在另一个分区(在win8下未分配空间)安装 ...
- ubuntu内核及系统升级
升级之前,需要先确认ubuntu当前系统版本,使用操作: root@Dy-JXQ-ubuntu-101:~# lsb_release -a No LSB modules are available. ...
- P2787 语文1(chin1)- 理理思维
P2787 语文1(chin1)- 理理思维 1.获取第x到第y个字符中字母k出现了多少次 2.将第x到第y个字符全部赋值为字母k 3.将第x到第y个字符按照A-Z的顺序排序 读字符串我再单个单个读我 ...
- P2424 约数和 && 真丶除法分块
P2424 约数和 题目背景 Smart最近沉迷于对约数的研究中. 题目描述 对于一个数X,函数f(X)表示X所有约数的和.例如:f(6)=1+2+3+6=12.对于一个X,Smart可以很快的算出f ...
- [网络流24题] 最长k可重区间集
https://www.luogu.org/problemnew/show/3358 以区间(1,5),(2,6),(7,8)为例 建模方法一: 建模方法二: 离散化区间端点 相当于找k条费用最大的不 ...
- 针对TCP连接异常断开的分析
我们知道,一个基于TCP/IP的客户端-服务器的程序中,正常情况下,我会是启动服务器使其在一个端口上监听请求,等待客户端的连接:通过TCP的三次握手,客户端能够通过socket建立一个到服务器的连接: ...
- Windows服务的安装和卸载
## install %SystemRoot%\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe ***Cache.WinService.exe # ...
- Ubuntu 15.04 双击运行 *.sh、*.py文件
源 起 之前一直在Windows下用AndoridStudio,今天试了一下在Linux系统Ubuntu 15.04中配置Android Studio: 过程和Windws下差不多,但是最后没有生成桌 ...