静态SQL与动态SQL的比较

来源:互联网 发布:java参数传递构造函数 编辑:程序博客网 时间:2024/04/25 12:46

静态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

原创粉丝点击