Oracle中动态sql详解
编者:什么是动态sql
要么是ddl 要么是dml(带参数的)
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,语法如下:
1) 动态 sql 是指 DDL 和不确定的 DML (即 带 参数的 ) 2) 绑 定参数列表 为输 入参数列表,即其 类 型 为 in 型,在运行 时 刻与 句中的参数( 实际 上占位符,可以理解 函数里面的形式参数) 进 行 定。 3) 输 出参数列表 为动态 句 执 行后返 回的参数列表。 4) 由于 是在运行 刻 行确定的,所以相 对 于静 态 而言,其更多的会 损 失一些系 统 性能来 换 取其灵活性。
了更好的 明其 开发 的 过 程,下面列 举 一个 实 例: 设 数据 库 emp 表,其数据 如下:
ID |
NAME |
SALARY |
100 |
Jacky |
5600 |
101 |
Rose |
3000 |
102 |
John |
4500 |
要求:
1.创建该表并输入相应的数据。
2.根据特定ID可以查询到其姓名和薪水的信息。
3.根据大于特定的薪水的查询相应的员工信息。
根据前面的要求,可以分别创建三个过程(均使用动态sql)来实现:
过程一:
过程二:
find_info(p_id number) v_name varchar2(10); v_salary ; select name,salary from emp where id=:1 using p_id returning v_name,v_salary; 动态sql为查询语句dbms_output.put_line(v_name @H_301_407@||的收入为:'@H_301_407@||to_char(v_salary)); exception when others then dbms_output.put_line(找不到相应数据); find_info;