摘要:对动态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 |
| 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; |
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器