网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > SQL技巧
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
本月文章推荐
.讲解一个检索最近日期的采购价的.
.袖珍数据库连接查询手册.
.调整SQLServer2000运行中数据库结.
.如何在SqlServer与oracel中进行分.
.SQL Server静态页面导出技术3.
.数据库查询结果的动态排序(1).
.谈谈sql查询的between.
.SQL Server取得网站路径的几种方.
.数据转换冲突及转换过程中大对象.
.在SQL Server 2005修改存储过程.
.SQL Server 索引结构及其使用(二.
.SQL SERVER 2005 同步复制技术.
.实例讲解Informix日期边界处理的.
.利用flashback query 恢复误操作.
.解决SQL Server 2000之日志传送功.
.在SQLSERVER2005中实现素数计算.
.数据库的数据挖掘概述(一).
.SQL Server 2005中三种插入XML数.
.通过作业调度建立SQL Server的自.
.获得所有表信息的SQL语句.

动态SQL的编译原理与基本开发思想的关系

发表日期:2008-5-10


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表,其数据为如下:

ID NAME SALARY

100 Jacky 5600

101 Rose 3000

102 John 4500

要求:

1.创建该表并输入相应的数据。

2.根据特定ID可以查询到其姓名和薪水的信息。

3.根据大于特定的薪水的查询相应的员工信息。

根据前面的要求,可以分别创建三个过程(均使用动态SQL)来实现:

过程一:

create or replace procedure create_table

asbeginexecute immediate 'create table emp

(id number,name varchar2(10)salary number; )';

--动态SQL为DDL语句

insert into empvalues (100,'jacky',5600);

insert into empvalues (101,'rose',3000);

insert into empvalues (102,'john',4500);end create_table;

过程二:

create or replace procedure find_info(p_id number)

asv_name varchar2(10);v_salary number;beginexecute

immediate 'select name,salary from empwhere id=:1'

using p_idreturning into v_name,v_salary;

--动态SQL为查询语句dbms_output.put_line

(v_name ||'的收入为:'||to_char(v_salary));

exceptionwhen others thendbms_output.put_line('找不到相应数据');

end find_info;

过程三:

create or replace procedure find_emp(p_salary number)

asr_emp emp%rowtype;type c_type is ref cursor;c1 c_type;

beginopen c1 for 'select * from empwhere salary >:1'

using p_salary;loopfetch 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执行的过程很类似,这里就不在赘述了。

上一篇:如何用RAMDISK来提高PostgreSQL访问速度 人气:895
下一篇:教你快速掌握分别删除数据表记录的方法 人气:1012
浏览全部数据库的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐