日期:2011-03-21 00:21:00 来源:本站整理
<b>基于Oracle的高性能动态SQL程序开辟</b>[Oracle防范]
本文“<b>基于Oracle的高性能动态SQL程序开辟</b>[Oracle防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
择要:对动态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表,其数据为以下:
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履行的历程很近似,这里就不在赘述了.
以上是“<b>基于Oracle的高性能动态SQL程序开辟</b>[Oracle防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论