在Oracle中执行动态SQL的几种方法------转载
在Oracle中执行动态SQL的几种方法
在一般的sql操作中,sql语句基本上都是固定的,如:
SELECT t.empno,t.ename FROM scott.emp t WHERE t.deptno = 20;
但有的时候,从应用的需要或程序的编写出发,都可能需要用到动态SQl,如:
当 from 后的表 不确定时,或者where 后的条件不确定时,都需要用到动态SQL。
一、使用动态游标实现
1、声明动态游标
TYPE i_cursor_type IS REF CURSOR;
2、声明游标变量
my_cursor i_cursor_type;
3、使用游标
n_deptno:=20;
dyn_select := 'select empno,ename from emp where deptno='||n_deptno;
OPEN my_cursor FOR dyn_select;
LOOP
FETCH my_cursor INTO n_empno,v_ename;
EXIT WHEN my_cursor%NOTFOUND;
--用n_empno,v_ename做其它处理
--....
END LOOP;
CLOSE dl_cursor;
4、小结:动态游标可以胜任大多数动态SQL的需求了,使用简洁方便居家旅行之必备杀人放火之法宝。
二、使用 EXECUTE IMMEDIATE
最早大家都使用DBMS_SQL包,但是太太麻烦了,最终都放弃了。但是自从有了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比以前可能用到的更容易并且更高效.当意图执行动态语句时,适当地处理异常更加重要.应该关注于捕获所有可能的异常.
一。为什么要使用动态执行语句?
由于在PL/SQL 块或者存储过程中只支持DML语句及控制流语句,并不支持DDL语句,所以Oracle动态执行语句便应允而生了。关于DDL与DML的区别,请参见:DDL语句与DML语句及DCL和TCL。
二。动态执行语句怎么用?
动态执行语句代替了Oracle 8i中的DBMS_SQL Package包。
1)在PL/SQL中运行SQL语句,例如:
示例一:
BEGIN
EXECUTE IMMEDIATE 'select count(username) from user_users'; --DML(每条语句必须以分号结尾)
END;
示例二:
BEGIN
EXECUTE IMMEDIATE 'ALTER TABLE a RENAME TO EXAMPLE'; --DDL
END;
你可能会问不是只DDL语句需要用动态语句执行吗?是的,你说的完全正确。但是DML语句用动态语句执行也可以。
即:DDL语句只能用动态执行语句来执行,DML语句亦可用动态语句来执行。
2)使用using给动态语句传值,例如:
DECLARE
e_name VARCHAR2(10); --声明变量e_name
e_age INT; --声明变量e_age
BEGIN
e_name := 'sillylaura'; --给变量e_name赋值
e_age := 21; --给变量e_age 赋值
EXECUTE IMMEDIATE 'insert into Example values(seq_add_by_one.nextval,:2,:3)' using e_name,e_age; --DML END;
3)使用动态语句赋值(select 列名 into 变量 from ……)
DECLARE
temp INT;
BEGIN
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM dual' INTO temp; --DML
dbms_output.put_line(temp);
END;
4)传递并检索值:into用在using之前。
DECLARE
temp INT;
test VARCHAR2(10);
BEGIN
test := 'ok';
EXECUTE immediate 'SELECT COUNT(*) FROM dual where dummy = :1 GROUP BY dummy' INTO temp USING test;
dbms_output.put_line(temp ||' '|| test);
EXCEPTION WHEN OTHERS THEN
dbms_output.put_line('It has no data!');
END;
三。动态语句小结
- DDL语句只能用动态执行语句来执行,DML语句亦可用动态语句来执行。
- 在使用select……into子句为变量赋值时,into字句必须写在单引号外面。
- 在同时使用select……into子句和using时,注意二者的顺序:into用在using之前,且都在单引号外面。
- 注意写上必要的异常错误处理。
转载于:https://www.cnblogs.com/kaililikai/p/5974506.html
在Oracle中执行动态SQL的几种方法------转载相关推荐
- 怎么在oracle里执行sql语句,在Oracle中执行动态SQL的几种方法
在一般的sql操作中,sql语句基本上都是固定的,如: SELECT t.empno,t.ename FROM scott.emp t WHERE t.deptno = 20; 但有的时候,从应用的需 ...
- oracle中执行动态sql语句吗,oracle中有没有可动态执行sql语句的函数
oracle中有没有可动态执行sql语句的函数 关注:233 答案:2 手机版 解决时间 2021-03-05 15:53 提问者祗剩寂寞 2021-03-04 22:38 oracle中有没有可 ...
- DB2 存储过程中执行动态SQL的两种写法
样本代码: DROP PROCEDURE QUOTATION.COPY_SAMPLE; CREATE PROCEDURE QUOTATION.COPY_SAMPLE (IN tableNameFrom ...
- oracle中执行某sql语句后,如一系列delete、update等操作,怎么看影响的行数?如我执行了n个表的delete语句,得看我删除了多少数据,万一sql写的有问题,误删了数据,不是灾难?
oracle中执行某sql语句后,如一系列delete.update等操作,怎么看影响的行数?如我执行了n个表的delete语句,得看我删除了多少数据,万一sql写的有问题,误删了数据,不是灾难? 使 ...
- Linux中执行shell脚本的4种方法
这篇文章主要介绍了Linux中执行shell脚本的4种方法总结,即在Linux中运行shell脚本的4种方法,需要的朋友可以参考下. bash shell 脚本的方法有多种,现在作个小结.假设我们编写 ...
- python调用shell命令-在Python中执行shell命令的6种方法,你都知道吗?
原标题:在Python中执行shell命令的6种方法,你都知道吗? Python经常被称作"胶水语言",因为它能够轻易地操作其他程序,轻易地包装使用其他语言编写的库.今天我们就讲解 ...
- python使用教程cmd啥意思-对python中执行DOS命令的3种方法总结
1. 使用os.system("cmd") 特点是执行的时候程序会打出cmd在Linux上执行的信息. import os os.system("ls") 2. ...
- python运行命令_对python中执行DOS命令的3种方法总结
1. 使用os.system("cmd") 特点是执行的时候程序会打出cmd在Linux上执行的信息. import os os.system("ls") 2. ...
- aix shell脚本 运行java_Linux中执行shell脚本的4种方法总结
Linux中执行shell脚本的4种方法总结,即在Linux中运行shell脚本的4种方法: 方法一:切换到shell脚本所在的目录(此时,称为工作目录)执行shell脚本: 复制代码 代码如下: c ...
最新文章
- 与优秀的人在一起,自己也会优秀起来!高质量技术群等你加入!
- 【Groovy】自定义 Xml 生成器 BuilderSupport ( 继承 BuilderSupport 抽象类 | 在 createNode 方法中获取节点名称、节点属性、节点值信息 )
- 十天学会ASP.net
- BZOJ 1269: [AHOI2006]文本编辑器editor Splay
- mysql中整理设置__MySQL整理
- c程序设计语言选修难吗,欢迎大家选修C语言程序设计这门课,本帖解释一下一些常见的问题...
- 前端学习(1095):ES5新增方法
- 【转】医疗业务学习笔记--DICOM协议的基础内容!!!!!!!!!!
- C4d酷炫立体空间质感电商海报素材,紧抓时尚潮流
- ubuntu 安装J2EE环境
- LAMP+Varnish缓存详解(一)——Varnish简介
- 防止Mac电脑屏幕进入休眠状态,该怎么设置?
- 全志F1c100s主线linux入坑记录 (2)芯片超频
- 51系列单片机寻址方式
- 万元怎样保留小数点_如何让数字以万元为单位显示并保留2位小数,且有千位分隔符...
- 软件工程师之路-软考(中级)1
- 闲置台式机+文件服务器,卖不出闲置台式机再利用之我的nas!
- 层次分析法原理及实例(AHP)
- 如何在浏览器中运行Linux程序,如何在Chromebook的浏览器标签中运行完整的Linux桌面 | MOS86...
- 第三十三篇,网络编程TCP协议通讯过程实现和函数接口
热门文章
- 曾梦想 if-else 走天涯?看看“责任树模式”优化
- CFG与PCFGs算法详解
- 计蒜客-1664-口袋的天空(MST)
- 精准引流客源的方法 129种引流方法全方位操作
- java的Pattern类
- imToken 投资 imKey 并推出通用硬件钱包方案
- IBM MQ常用命令
- 神舟Z7本安装Linux系统,神舟战神Z7-KP7GAISO重装原版Win10系统的方法
- 我的世界服务器如何修改天气,我的世界天气修改设置、天气关闭锁定、天气指令代码作弊码大全-66街机网...
- 淘宝/天猫获得淘宝商品详情高级版 API