Oracle动态SQL和静态SQL比较

简介:

1.静态SQLSQL与动态SQL
Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情况属于这种类型;另外一种是后期联编(late binding),即SQL语句只有在运行阶段才能建立,例如当查询条件为用户输入时,那么Oracle的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是在运行时刻进行确定的,所以相对于静态而言,其更多的会损失一些系统性能来换取其灵活性。

 为了更好的说明其开发的过程,下面列举一个实例:
设数据库的他表,其数据为如下:

ID

NAME

SAL

10

scott

3000

20

tom

5000

30

jerry

4500

要求:
1.创建该表并输入相应的数据。
2.根据特定ID可以查询到其姓名和薪水的信息。
3.根据大于特定的薪水的查询相应的员工信息。
根据前面的要求,可以分别创建三个过程(均使用动态SQL)来实现:

过程一:(创建表并插入数据)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
18 : 16 : 27  SCOTT@ prod>create  or  replace  procedure p1  as
18 : 16 : 36    2   flag number; 
18 : 16 : 36    3   begin
18 : 16 : 36    4   select count(*)  into  flag  from  all_tables  where  table_name= 'T1' ;
18 : 16 : 36    5   if  (flag= 0 then 
18 : 16 : 36    6   execute immediate  'create table t1(id number,name varchar2(10),sal number)' ;
18 : 16 : 36    7   else
18 : 16 : 36    8   insert  into  t1 values ( 10 , 'scott' , 3000 );
18 : 16 : 36    9   insert  into  t1 values ( 20 , 'tom' , 5000 );
18 : 16 : 37   10   insert  into  t1 values ( 30 , 'jerry' , 4500 );
18 : 16 : 37   11   end  if ;
18 : 16 : 37   12   end p1;
18 : 16 : 38   13   /
Procedure created.
Elapsed:  00 : 00 : 00.20
18 : 16 : 40  SCOTT@ prod>exec p1;
PL/SQL procedure successfully completed.
Elapsed:  00 : 00 : 00.18
18 : 16 : 47  SCOTT@ prod>select *  from  t1;
         ID NAME              SAL
---------- ---------- ----------
         10  scott             3000
         20  tom               5000
         30  jerry             4500
Elapsed:  00 : 00 : 00.01
18 : 16 : 52  SCOTT@ prod>


过程二:(按id查询用户信息)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
18 : 40 : 24  SCOTT@ prod>create  or  replace  procedure p2 (p_id number)  as
18 : 40 : 26    2    v_name varchar2( 10 );
18 : 40 : 26    3    v_sal number;
18 : 40 : 26    4    begin
18 : 40 : 26    5    execute immediate  'select name,sal  from t1  where id=:1'  into  v_name,v_sal using p_id;
18 : 40 : 26    6    dbms_output.put_line(v_name || ' Salary is: ' ||to_char(v_sal));
18 : 40 : 26    7     exception
18 : 40 : 26    8    when others  then
18 : 40 : 26    9    dbms_output.put_line( 'No Data Found' );
18 : 40 : 26   10    end p2;
18 : 40 : 26   11    /
Procedure created.
Elapsed:  00 : 00 : 00.07
18 : 40 : 27  SCOTT@ prod>exec p2( 10 );
scott Salary is:  3000
PL/SQL procedure successfully completed.
Elapsed:  00 : 00 : 00.01
18 : 40 : 32  SCOTT@ prod>exec p2( 20 );
tom Salary is:  5000
PL/SQL procedure successfully completed.
Elapsed:  00 : 00 : 00.02
18 : 40 : 40  SCOTT@ prod>exec p2( 30 );
jerry Salary is:  4500
PL/SQL procedure successfully completed.
Elapsed:  00 : 00 : 00.02
18 : 40 : 45  SCOTT@ prod>


过程三:(查询薪水大于某个值的员工)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
18 : 48 : 59  SCOTT@ prod>create  or  replace  procedure p3(p_sal number)  as
18 : 50 : 55    2   r_t1 t1%rowtype;
18 : 50 : 55    3   type c_type is ref cursor;
18 : 50 : 56    4   c1 c_type;
18 : 50 : 56    5   begin
18 : 50 : 56    6   open c1  for  '
18 : 50 : 56    7   select *  from  t1
18 : 50 : 56    8   where  sal >: 1 '
18 : 50 : 56    9   using p_sal;
18 : 50 : 56   10   loop
18 : 50 : 56   11   fetch c1  into  r_t1;
18 : 50 : 56   12   exit when c1%notfound;
18 : 50 : 56   13   dbms_output.put_line( 'Salary higher ' ||to_char(p_sal)|| ' Name is:' );
18 : 50 : 56   14   dbms_output.put_line( 'ID is '  ||to_char(r_t1.id)|| ' Name is: ' ||r_t1.name);
18 : 50 : 56   15   end loop;
18 : 50 : 56   16   close c1;
18 : 50 : 56   17   end p3;
18 : 50 : 57   18   /
Procedure created.
Elapsed:  00 : 00 : 00.12
18 : 50 : 58  SCOTT@ prod>exec p3( 2000 );
Salary higher  2000  Name is:
ID is  10  Name is: scott
Salary higher  2000  Name is:
ID is  20  Name is: tom
Salary higher  2000  Name is:
ID is  30  Name is: jerry
PL/SQL procedure successfully completed.
Elapsed:  00 : 00 : 00.02
18 : 51 : 15  SCOTT@ prod>


注意:在过程二中的动态SQL语句使用了占位符“:1“,其实它相当于函数的形式参数,使用”:“作为前缀,然后使用using语句将p_id在运行时刻将:1给替换掉,这里p_id相当于函数里的实参。另外过程三中打开的游标为动态游标,它也属于动态SQL的范畴,其整个编译和开发的过程与execute immediate执行的过程很类似。










本文转自 客居天涯 51CTO博客,原文链接:http://blog.51cto.com/tiany/1422210,如需转载请自行联系原作者
目录
相关文章
|
1天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL游标属性:数据的“导航仪”与“仪表盘”
【4月更文挑战第19天】Oracle PL/SQL游标属性如同车辆的导航仪和仪表盘,提供丰富信息和控制。 `%FOUND`和`%NOTFOUND`指示数据读取状态,`%ROWCOUNT`记录处理行数,`%ISOPEN`显示游标状态。还有`%BULK_ROWCOUNT`和`%BULK_EXCEPTIONS`增强处理灵活性。通过实例展示了如何在数据处理中利用这些属性监控和控制流程,提高效率和准确性。掌握游标属性是提升数据处理能力的关键。
|
1天前
|
SQL Oracle 安全
Oracle的PL/SQL循环语句:数据的“旋转木马”与“无限之旅”
【4月更文挑战第19天】Oracle PL/SQL中的循环语句(LOOP、EXIT WHEN、FOR、WHILE)是处理数据的关键工具,用于批量操作、报表生成和复杂业务逻辑。LOOP提供无限循环,可通过EXIT WHEN设定退出条件;FOR循环适用于固定次数迭代,WHILE循环基于条件判断执行。有效使用循环能提高效率,但需注意避免无限循环和优化大数据处理性能。掌握循环语句,将使数据处理更加高效和便捷。
|
1天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL条件控制:数据的“红绿灯”与“分岔路”
【4月更文挑战第19天】在Oracle PL/SQL中,IF语句与CASE语句扮演着数据流程控制的关键角色。IF语句如红绿灯,依据条件决定程序执行路径;ELSE和ELSIF提供多分支逻辑。CASE语句则是分岔路,按表达式值选择执行路径。这些条件控制语句在数据验证、错误处理和业务逻辑中不可或缺,通过巧妙运用能实现高效程序逻辑,保障数据正确流转,支持企业业务发展。理解并熟练掌握这些语句的使用是成为合格数据管理员的重要一环。
|
1天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL表达式:数据的魔法公式
【4月更文挑战第19天】探索Oracle PL/SQL表达式,体验数据的魔法公式。表达式结合常量、变量、运算符和函数,用于数据运算与转换。算术运算符处理数值计算,比较运算符执行数据比较,内置函数如TO_CHAR、ROUND和SUBSTR提供多样化操作。条件表达式如CASE和NULLIF实现灵活逻辑判断。广泛应用于SQL查询和PL/SQL程序,助你驾驭数据,揭示其背后的规律与秘密,成为数据魔法师。
|
1天前
|
SQL 存储 Oracle
Oracle的PL/SQL定义变量和常量:数据的稳定与灵动
【4月更文挑战第19天】在Oracle PL/SQL中,变量和常量扮演着数据存储的关键角色。变量是可变的“魔术盒”,用于存储程序运行时的动态数据,通过`DECLARE`定义,可在循环和条件判断中体现其灵活性。常量则是不可变的“固定牌”,一旦设定值便保持不变,用`CONSTANT`声明,提供程序稳定性和易维护性。通过 `%TYPE`、`NOT NULL`等特性,可以更高效地管理和控制变量与常量,提升代码质量。善用两者,能优化PL/SQL程序的结构和性能。
|
1月前
|
SQL Java 关系型数据库
MyBatis的动态SQL之OGNL(Object-Graph Navigation Language)表达式以及各种标签的用法
MyBatis的动态SQL之OGNL(Object-Graph Navigation Language)表达式以及各种标签的用法
16 0
|
1月前
|
SQL Java 关系型数据库
MyBatis中的9种常用动态sql标签精妙用法
MyBatis中的9种常用动态sql标签精妙用法
49 0
|
1月前
|
SQL Oracle 关系型数据库
Oracle系列十一:PL/SQL
Oracle系列十一:PL/SQL
|
SQL Oracle 关系型数据库
oracle 的动态采样技术
Oracle 数据库中优化器(Optimizer)是SQL分析和执行的优化工具,它负责指定SQL的执行计划,也就是它负责保证SQL执行的效率最高,比如优化器决定Oracle 以什么样的方式来访问数据,是全表扫描(Full Table Scan),索引范围扫描(Index Range Scan)还是全索引快速扫描(INDEX Fast Full Scan:INDEX_FFS);对于表关联查询,它负责确定表之间以一种什么方式来关联,比如HASH_JOHN还是NESTED LOOPS 或者MERGE JOIN。
1007 0
|
9天前
|
SQL Oracle 关系型数据库
【Oracle】玩转Oracle数据库(一):装上去,飞起来!
【Oracle】玩转Oracle数据库(一):装上去,飞起来!
48 7

推荐镜像

更多