`
bcyy
  • 浏览: 1826436 次
文章分类
社区版块
存档分类
最新评论

静态SQL与动态SQL的比较

 
阅读更多

静态SQL与动态SQL相比具备很多优点,最主要的表现在两个方面:

1、 静态SQL指定具体的对象,可以避免动态SQL中隐含的错误

2、 静态SQL的分析和执行速度比动态SQL要快

所以,如果使用静态SQL可以达到目的,我们推荐用静态SQL替代动态SQL,即使需要多编写一些代码也是值得的。那么,在开发程序代码的时候,如何判定一段SQL代码究竟该采用动态SQL,还是该采用静态SQL呢?简单总结以下几个原则,供大家参考:

1、寻找消除动态SQL的机会

一般而言,想采用动态SQL实现的语句中都有不确定的因素,如果所有信息都确定,没有理由采用动态SQL来实现,SQL语句的不确定因素包括:SQL选择的字段列名不确定,选择的From表名不确定,以及Where条件中的条件字段名不确定等情况,可采用Decode, Case,以及IF ELSE来分情况写成静态SQL。

举例:

Execute immediate

‘select ‘|| p_name||’ from app_main where eff_date>sysdate-1’ into v_value;

如果这个字段的取值为有限的几个值,则可以写成以下静态SQL:

Select decode(p_name,’ a’, a,

‘b’, b,

‘c’, c,

‘c_DATE’,to_char(c_DATE,’yyyymmdd’)) into v_value from tab_name;

2、在代码长短以及SQL语句的执行频率上折中考虑

如果一段SQL代码的Where条件非常复杂,SQL语句本身也很长,甚至关联到很多大表(这是我们经常遇到的情况),按照IF ELSE的方式写成静态SQL的话,整个程序的代码就会非常长,因此开发人员更偏向于使用动态SQL。在这种情况下,就需要考虑到代码的执行频率,以及SQL语句在不同情况下的执行计划,如果执行频率较高,且各种情况执行计划间的区别很大,则改写成静态SQL更加合理;对于写成静态SQL代码异常长的情况,我们可以将执行频率高的主要SQL写成静态SQL,其他情况分类写成动态SQL。这样做,有利于我们按照不同的情况,固定执行计划(前段时间发生过一个事件,在动态SQL中固定执行计划,造成一种情况效率改善,另一种情况效率明显降低)。

3、无法用静态SQL或运行频率较低的简单SQL可采用动态SQL实现

有些情况下,没有办法确定SQL语句中字段列名或者表名,也没有办法确定这些可变因素的个数,则只能采用动态SQL来实现。再就是一次性执行的脚本,或者执行次数少的SQL也可以写成动态SQL(能加上绑定变量更好),这时性能问题不大,程序代码也显得简洁。

举例:

传入参数是sequence的名字,按照这个名字获取序列值,这时采用动态SQL可以灵活的执行语句,不必每增加一个seuence就增加一个语句。再就是要truncate table(根据传入进来的table名字执行truncate,这个我们用的比较多)。

IF condition THEN

--code

ELSIF condition THEN

--code

else

--code

END IF;

CASE
WHEN condition1 THEN value1;

WHEN condition2 THEN value2;
WHEN condition3 THEN value3;
ELSE value4;
END CASE

分享到:
评论

相关推荐

    静态、动态sql及各种游标

    静态、动态sql及各种游标,适合初学者学习

    springboot_mybatis_整合(静态mapper和动态sql)

    这个版本包括log4j2 sql Mapper 和 动态sql 具体参见: http://blog.csdn.net/tianhongqiang/article/details/57082946(框架整合) http://blog.csdn.net/tianhongqiang/article/details/60975953(sql mapper) ...

    sql行转列动态与静态

    sql行转列动态与静态三种方法

    基本静态sql语法,削除空格

    基本的sql,用于简化文档处理……包括取出前后空格,替代一些列中的特定字符串等。

    t-sql编程行列转换(静态和动态)

    t-sql编程实现静态和动态的行转列、列转行代码

    DB2嵌入式静态SQL应用与实践.pdf

    DB2嵌入式静态SQL应用与实践.pdf

    SQL行转列和列转行-静态互转-动态互转

    有case when方式和2005之后的内置pivot和unpivot方法来实现,行列互转,可以分为静态互转,动态互转。

    嵌入式SQL(E-SQL)简介

    1.2 什么是静态SQL和动态SQL? 4 1.3 什么是SQLCA? 4 1.4 什么是SQLDA? 5 第二节 SYBASE SQL SERVER嵌入式SQL语言 5 2.1 一个嵌入SQL语言的简单例子 5 2.2 嵌入SQL的处理过程 6 2.3 嵌入SQL语句总览 7 2.3.1 宿主...

    数据库嵌入式SQL介绍与应用

    1.2 什么是静态SQL和动态SQL? 4 1.3 什么是SQLCA? 4 1.4 什么是SQLDA? 5 第二节 SYBASE SQL SERVER嵌入式SQL语言 5 2.1 一个嵌入SQL语言的简单例子 5 2.2 嵌入SQL的处理过程 6 2.3 嵌入SQL语句总览 7 2.3.1 宿主...

    SQL Server中的动态和静态内存分配

    SQL服务器有两种基本管理方法:动态分配和静态分配,用以控制程序可使用的内存数量。动态 分配允许管理员声明一块内存的大小;考虑到它的实际使用,SQL服务器可以分配给其需要占用的内存的最大值,并且(理论上)在...

    sqlserver各版本jdbc驱动.zip

    sqlserver各版本驱动 DriverManager:负责...Statement:用以执行SQL查询和更新(针对静态SQL语句和单次执行)。PreparedStatement:用以执行包含动态参数的SQL查询和更新(在服务器端编译,允许重复执行以提高效率)

    SQL、Hive SQL等SQL血缘解析工具

    // 具有子查询的sql String hql = "select id,name from (select id from table_1 where id={p0}) t1 inner join (select name --this is name\n from table_2) t2"; // 获取id字段的血缘 LineageNode idNode = ...

    静态分区.sql

    静态分区.sql

    sql 行转列 静态、动态 实例

    讲述,sql中如何实现行转列的实例,包含知道固定行数的静态转换,与未知行数的动态转换。

    sql学习 一键获取库总体情况_静态.sql

    sql学习 一键获取库总体情况_静态.sql

    织梦SQL调用文章并获取静态地址的方法

    在Dede系统SQL调用文章并获取静态地址的方法里面,我可以可以自由使用SQL调用文章并获取静态地址的方法SQL语句来配合织梦标签SQL调用文章并获取静态地址的方法进行更多的个性化调用。 如果是dede:php标签,也差不多...

    html前端sql格式化.zip

    借助sql-formatter.js插件与ace实现web页面的sql格式化功能。有需要的开发人员可以下载参考。方便了页面操作sql。

    分享一下SQL Server执行动态SQL的正确方式

    SQL Server执行动态SQL的话,...相信使用过动态SQL的人都能体会到它带来的便利,然而动态SQL有时候在执行性能(效率)上面不如静态SQL,而且使用不恰当,往往会在安全方面存在隐患(SQL 注入式攻击).  动态SQL可以通过EXECUTE

    SQL21日自学通

    静态SQL 与动态SQL277 使用SQL 来编程279 总结280 问与答280 校练场280 练习281 第14 天动态使用SQL 282 目标282 快速入门282 ODBC 282 Personal Oracle 7283 InterBase SQL ISQL 283 Visual C++ 284 Delphi284 设置...

    oracle中动态SQL使用详细介绍

    1.静态SQLSQL与动态SQL Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情况属于这种类型;另外一种是后期联编(late binding),即SQL语句...

Global site tag (gtag.js) - Google Analytics