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

怎么在oracle里执行sql语句,在Oracle中执行动态SQL的几种方法相关推荐

  1. SQL Server在存储过程中编写事务处理代码的三种方法

    SQL Server中数据库事务处理是相当有用的,鉴于很多SQL初学者编写的事务处理代码存往往存在漏洞,本文我们介绍了三种不同的方法,举例说明了如何在存储过程事务处理中编写正确的代码.希望能够对您有所 ...

  2. ef执行原生sql语句_EF Core中执行原生SQL语句

    一.课程介绍之所以今天录制这个系列文章的主要原因是,想在快速帮助到大家上手在ASP.NET Core WebAPI中结合EF Core来操作我们的数据库.EF Core的基础文章和基础课程实在是太多了 ...

  3. oracle嵌套三层循环语句,在存储过程中执行3种oracle循环语句

    http://www.cnblogs.com/coprince/p/3443219.html create or replace procedure pr_zhaozhenlong_loop /* 名 ...

  4. aop判断方法是否执行成功_判断图中是否有环的三种方法

    0.什么是环? 在图论中,环(英语:cycle)是一条只有第一个和最后一个顶点重复的非空路径. 在有向图中,一个结点经过两种路线到达另一个结点,未必形成环. 1.拓扑排序 1.1.无向图 使用拓扑排序 ...

  5. mysql导出不带注释的sql语句_MySQL mysqlbinlog解析出的SQL语句被注释是怎么回事

    MySQL mysqlbinlog解析出的SQL语句被注释是怎么回事 一网友反馈使用mysqlbinlog解析出的二进制日志中的内容中,有些SQL语句有#注释的情况,这个是怎么回事呢?我们通过实验来了 ...

  6. oracle某用户历史sql语句,查看oracle 用户执行的sql语句历史记录

    select * from v$sqlarea t where t.PARSING_SCHEMA_NAME in ('用户名') order by t.LAST_ACTIVE_TIME desc se ...

  7. python执行mysql多个sql语句_mysql -- 一次执行多条sql语句

    最近要做一个软件升级,其中涉及到数据库表字段的变动(新增或删除或修改),所有的关于数据库的变动的sql语句都是存放在Sqlupdate.sql文件中,每次升级的时候都需要执行一次Sqlupdate.s ...

  8. 一条SQL语句在MySQL中是如何执行的

    来源:http://t.cn/E6U9Z9T 概览 本篇文章会分析下一个sql语句在mysql中的执行流程,包括sql的查询在mysql内部会怎么流转,sql语句的更新是怎么完成的. 一.mysql架 ...

  9. mysql执行一条sql语句的完整过程,sql语句在mysql中的执行过程

    文章目录 1. SQL语句在mysql的执行过程 一:客户端层 二:mysql服务器层 三:innoDB引擎层 2. undo日志.redo日志.binlog日志的区别? 1. SQL语句在mysql ...

  10. SQL语句在Mysql中是如何被执行的?

    前言 相信大家用了这么久的Mysql,一定很好奇自己写的SQL是如何执行并返回结果的,今天我们就来一层一层剥开Mysql这颗洋葱. 首先我们通过一张图来了解下整个过程,然后再开始一步一步解析. 第一步 ...

最新文章

  1. 城市地区级联二级下拉选择菜单js特效
  2. 华为发布基于自进化AI的HiSec Insight安全态势感知系统
  3. IntelliJ IDEA下project概念和module的概念解释
  4. DI、IOC基础学习笔记
  5. (转)如何诊断和解决CPU高度消耗(100%)的数据库问题
  6. 什么能让我们用青春、用生命去垫付?
  7. 城市道路智慧照明服务认证的流程及作用
  8. linux 防火墙服务器,Linux服务器上适用的防火墙分析
  9. “天鹅”类谜解大全!-
  10. 台式计算机关机后自行重启,台式电脑关机后自动重启怎么办?台式电脑关机后自动开机的处理办法...
  11. git commit 参数详解 --amend
  12. 视频录制软件有哪些?4款录制视频软件,免费下载
  13. oracle数据库左边栏不见,Oracle数据库中分区表的操作方法
  14. 将你的 Python 脚本转换为命令行程序
  15. WOL网络唤醒远程开机的关键步骤,魔术唤醒一步都不能少!
  16. linux cat eof如何指定变量,Linux cat和EOF的使用
  17. element-ui 带序号表格如何让序号递增
  18. 【例26图片的加密解密操作】
  19. 7 张图三维组态编辑器图片,教你轻松数字孪生工厂
  20. 【整理】锂电池组保护板电路设计资料

热门文章

  1. java List 根据某个字段进行升降序排列
  2. 字节面试杂谈——MySQL、Redis
  3. Excel转储mysql_小程序解析excel表格并存储到云数据库
  4. 基于qt的计算机论文,基于qt的科学计算器的设计与实现本科毕业论文.doc
  5. 液相色谱仪网络版计算机化再确认,高效液相色谱仪计算机验证部分要点!
  6. android 启动画面广告,浅谈APP启动界面广告
  7. 美国知名科技公司入门级软件工程师的薪水排名
  8. 触觉是怎么产生的?清华大学破解诺奖成果未解之谜,登上Nature
  9. MySQL实现排名、分组筛选、TopN问题
  10. 新版ideal2021配置Tomcat