基于Oracle的高性能动态SQL程序开发
来源:天极网 作者:冯杰 出处:综艺读书 2005-12-03 摘要:对动态SQL的程序开发进行了总结,并结合笔者实际开发经验给出若干开发技巧。
关键词:动态SQL,PL/SQL,高性能
1. 静态SQLSQL与动态SQL
Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情况属于这种类型;另外一种是后期联编(late binding),即SQL语句只有在运行阶段才能建立,例如当查询条件为用户输入时,那么Oracle的SQL引擎就无法在编译期对该程序语句进行确定,只能在用户输入一定的查询条件后才能提交给SQL引擎进行处理。通常,静态SQL采用前一种编译方式,而动态SQL采用后一种编译方式。
本文主要就动态SQL的开发进行讨论,并在最后给出一些实际开发的技巧。
2. 动态SQL程序开发
理解了动态SQL编译的原理,也就掌握了其基本的开发思想。动态SQL既然是一种”不确定”的SQL,那其执行就有其相应的特点。Oracle中提供了Execute immediate语句来执行动态SQL,语法如下:
Excute immediate 动态SQL语句 using 绑定参数列表 returning into 输出参数列表;
对这一语句作如下说明:
1) 动态SQL是指DDL和不确定的DML(即带参数的DML)
2) 绑定参数列表为输入参数列表,即其类型为in类型,在运行时刻与动态SQL语句中的参数(实际上占位符,可以理解为函数里面的形式参数)进行绑定。
3) 输出参数列表为动态SQL语句执行后返回的参数列表。
4) 由于动态SQL是在运行时刻进行确定的,所以相对于静态而言,其更多的会损失一些系统性能来换取其灵活性。
为了更好的说明其开发的过程,下面列举一个实例:
设数据库的emp表,其数据为如下:
要求:
1.创建该表并输入相应的数据。
2.根据特定ID可以查询到其姓名和薪水的信息。
3.根据大于特定的薪水的查询相应的员工信息。
根据前面的要求,可以分别创建三个过程(均使用动态SQL)来实现:
过程一:
过程二:
过程三:
注意:在过程二中的动态SQL语句使用了占位符“:1“,其实它相当于函数的形式参数,使用”:“作为前缀,然后使用using语句将p_id在运行时刻将:1给替换掉,这里p_id相当于函数里的实参。另外过程三中打开的游标为动态游标,它也属于动态SQL的范畴,其整个编译和开发的过程与execute immediate执行的过程很类似,这里就不在赘述了。
更多内容请看Oracle 10g基础应用 Oracle开发 PL/SQL专题,或进入讨论组讨论。
关键词:动态SQL,PL/SQL,高性能
1. 静态SQLSQL与动态SQL
|
|
|||
本文主要就动态SQL的开发进行讨论,并在最后给出一些实际开发的技巧。
2. 动态SQL程序开发
理解了动态SQL编译的原理,也就掌握了其基本的开发思想。动态SQL既然是一种”不确定”的SQL,那其执行就有其相应的特点。Oracle中提供了Execute immediate语句来执行动态SQL,语法如下:
Excute immediate 动态SQL语句 using 绑定参数列表 returning into 输出参数列表;
对这一语句作如下说明:
1) 动态SQL是指DDL和不确定的DML(即带参数的DML)
2) 绑定参数列表为输入参数列表,即其类型为in类型,在运行时刻与动态SQL语句中的参数(实际上占位符,可以理解为函数里面的形式参数)进行绑定。
3) 输出参数列表为动态SQL语句执行后返回的参数列表。
4) 由于动态SQL是在运行时刻进行确定的,所以相对于静态而言,其更多的会损失一些系统性能来换取其灵活性。
为了更好的说明其开发的过程,下面列举一个实例:
设数据库的emp表,其数据为如下:
| ID | NAME | SALARY |
| 100 | Jacky | 5600 |
| 101 | Rose | 3000 |
| 102 | John | 4500 |
要求:
1.创建该表并输入相应的数据。
2.根据特定ID可以查询到其姓名和薪水的信息。
3.根据大于特定的薪水的查询相应的员工信息。
根据前面的要求,可以分别创建三个过程(均使用动态SQL)来实现:
过程一:
| create or replace procedure create_table as begin execute immediate ' create table emp(id number, name varchar2(10) salary number; )'; --动态SQL为DDL语句 insert into emp values (100,'jacky',5600); insert into emp values (101,'rose',3000); insert into emp values (102,'john',4500); end create_table; |
过程二:
| create or replace procedure find_info(p_id number) as v_name varchar2(10); v_salary number; begin execute immediate ' select name,salary from emp where id=:1' using p_id returning into v_name,v_salary; --动态SQL为查询语句 dbms_output.put_line(v_name ||'的收入为:'||to_char(v_salary)); exception when others then dbms_output.put_line('找不到相应数据'); end find_info; |
过程三:
| create or replace procedure find_emp(p_salary number) as r_emp emp%rowtype; type c_type is ref cursor; c1 c_type; begin open c1 for ' select * from emp where salary >:1' using p_salary; loop fetch c1 into r_emp; exit when c1%notfound; dbms_output.put_line('薪水大于‘||to_char(p_salary)||’的员工为:‘); dbms_output.put_line('ID为'to_char(r_emp)||' 其姓名为:'||r_emp.name); end loop; close c1; end create_table; |
注意:在过程二中的动态SQL语句使用了占位符“:1“,其实它相当于函数的形式参数,使用”:“作为前缀,然后使用using语句将p_id在运行时刻将:1给替换掉,这里p_id相当于函数里的实参。另外过程三中打开的游标为动态游标,它也属于动态SQL的范畴,其整个编译和开发的过程与execute immediate执行的过程很类似,这里就不在赘述了。
相关图文阅读
频道图文推荐
相关专题
·关于oracle存储过程的若干问题备忘 (0次浏览)
·讲解Oracle里抽取随机数的多种方法 (0次浏览)
·在数据字典中直接修改表列的名称和顺序 (0次浏览)
·数据库中如何使用SQL查询连续号码段 (0次浏览)
·如何使用分析函数进行行列转换 (0次浏览)
·改变非归档模式的Oracle数据库 (0次浏览)
·如何调试oracle, sql server存储过程 (0次浏览)
·oltp系统,数据块大小用4k还是8k好? (0次浏览)
·在RHEL4U4上安装Oracle10GS2 (0次浏览)
·如何在Python下连接Oracle数据库 (0次浏览)
·讲解Oracle里抽取随机数的多种方法 (0次浏览)
·在数据字典中直接修改表列的名称和顺序 (0次浏览)
·数据库中如何使用SQL查询连续号码段 (0次浏览)
·如何使用分析函数进行行列转换 (0次浏览)
·改变非归档模式的Oracle数据库 (0次浏览)
·如何调试oracle, sql server存储过程 (0次浏览)
·oltp系统,数据块大小用4k还是8k好? (0次浏览)
·在RHEL4U4上安装Oracle10GS2 (0次浏览)
·如何在Python下连接Oracle数据库 (0次浏览)
·如何使用Logmnr方法分析数据库日志 (18次浏览)
·Oracle-Decode()函数和CASE语句的比较 (18次浏览)
·Oracle9i数据挖掘介绍 (16次浏览)
·Linux 9i下Dataguard配置 (14次浏览)
·日志分析logmnr使用方法 (12次浏览)
·Oracle数据库如何查询记录时给记录加锁 (12次浏览)
·保持Oracle数据优良性能的若干诀窍 (10次浏览)
·Oracle体系框架及SQL语句性能探讨 (9次浏览)
·如何利用QCTO开发可重复使用的测试库 (8次浏览)
·理解物化视图刷新过程中出现的约束冲突 (8次浏览)
·Oracle-Decode()函数和CASE语句的比较 (18次浏览)
·Oracle9i数据挖掘介绍 (16次浏览)
·Linux 9i下Dataguard配置 (14次浏览)
·日志分析logmnr使用方法 (12次浏览)
·Oracle数据库如何查询记录时给记录加锁 (12次浏览)
·保持Oracle数据优良性能的若干诀窍 (10次浏览)
·Oracle体系框架及SQL语句性能探讨 (9次浏览)
·如何利用QCTO开发可重复使用的测试库 (8次浏览)
·理解物化视图刷新过程中出现的约束冲突 (8次浏览)
·Oracle的初学者入门心得 (588次浏览)
·Oracle DBA数据库日常维护完全手册 (294次浏览)
·Oracle体系结构:内存结构和进程结构 (248次浏览)
·开启企业殿堂的钥匙 Oracle服务器的安装 (185次浏览)
·将Oracle的数据导入EXCEL中的方法 (167次浏览)
·简单冷备份恢复操作步骤 (130次浏览)
·oracle下导出某用户所有表的方法 (128次浏览)
·ORACLE的客户端如何连接到数据库 (127次浏览)
·详细讲述 Oracle 密码丢失解决方法 (112次浏览)
·Oracle数据库在线备份原理 (103次浏览)
·Oracle DBA数据库日常维护完全手册 (294次浏览)
·Oracle体系结构:内存结构和进程结构 (248次浏览)
·开启企业殿堂的钥匙 Oracle服务器的安装 (185次浏览)
·将Oracle的数据导入EXCEL中的方法 (167次浏览)
·简单冷备份恢复操作步骤 (130次浏览)
·oracle下导出某用户所有表的方法 (128次浏览)
·ORACLE的客户端如何连接到数据库 (127次浏览)
·详细讲述 Oracle 密码丢失解决方法 (112次浏览)
·Oracle数据库在线备份原理 (103次浏览)
最新技术文档
·实战经验为何数据库归档日志名称为空 06-26
·快速掌握Oracle数据库游标的使用方法 06-26
·Oracle Lite 10g数据库第三版正式问世 06-25
·Oracle 动态SQL返回单条结果和结果集 06-25
·Oracle多行记录字符串综合操作几种方法 06-24
·如何通过实例配置Oracle监听器 06-24
·Oracle数据库中LONG类型字段的存取 06-24
·介绍几个基本的 SQLPLUS 命令 06-22
·与数据库无关的处理放到数据库以外来实现 06-22
·简析Oracle数据库最大可用性体系结构 06-22
·快速掌握Oracle数据库游标的使用方法 06-26
·Oracle Lite 10g数据库第三版正式问世 06-25
·Oracle 动态SQL返回单条结果和结果集 06-25
·Oracle多行记录字符串综合操作几种方法 06-24
·如何通过实例配置Oracle监听器 06-24
·Oracle数据库中LONG类型字段的存取 06-24
·介绍几个基本的 SQLPLUS 命令 06-22
·与数据库无关的处理放到数据库以外来实现 06-22
·简析Oracle数据库最大可用性体系结构 06-22
站内各频道最新更新文档
站内最新制作专题
|
|||
| ·ACDSEE专题教程-下载使用 ·迅雷专题教程-下载使用 ·Windows XP频道 ·Windows Vista频道 ·Windows 2000频道 ·win2003频道 ·Freebsd频道 ·Oracle频道 |
·Linux频道 ·Windows频道 ·邮件服务器专题 ·协议大全 ·数据恢复指南教程 ·FreeBSD使用教程 ·Linux数据库宝典 ·Linux基础知识 |
||
热门关键字导读
站内频道文章精选
| · 秘密:Vista隐蔽的动态屏保 · 腾讯开发新电子宠物--QQ熊 · 惠普否认2999元PC有价无货 |
· 驱逐Win系统“流氓”文件 · WinXP中获取未使用的IP地址 · 尝试format C:格式化硬盘? |
| · 在DOS下恢复回收站中的文件 · 拯救WinXP崩溃的救命稻草 · Linux系统中超级权限的应用 |
· 搜狗PK谷歌:谁能代言拼... · 昨日重现,一键GHOST轻松.. · 实现Web迅雷在空闲时杀毒 |
| · AVIFile函数制做AVI文件 · VC中链接动态链接库的方法 · 熊猫烧香核心源码(Delphi) |
· DateDiff函数祥解 · JavaScript去除空格的三种 · js效果 图片加载进度实时.. |
| · SQL Server数据库优化方案 · Oracle的初学者入门心得 · JSP连接Mysql数据库 |
· Photoshop为美女做艺术处理 · 用Freehand创建发光字特效 · 设计自己的个性QQ动态表情 |
百度推荐,商机无限
搜索您感兴趣的内容




