sql语句有两种方式,三种写法 oracle编译pl/sql程序块分为两个种:其一为前期联编(early binding),即sql语句在程序编译期间就已经确定,大多数的编译情况属于这种类型;另外一种是后期联编(late binding) 4)由于动态sql是在运行时刻进行确定的,所以相对
sql语句有两种方式,三种写法
oracle编译pl/sql程序块分为两个种:其一为前期联编(early binding),即sql语句在程序编译期间就已经确定,大多数的编译情况属于这种类型;另外一种是后期联编(late binding)
4)由于动态sql是在运行时刻进行确定的,所以相对于静态而言,其更多的会损失一些系统性能来换取其灵活性。
静态和动态 只是不同的方式 涉及的是前期和后期联编
对象信息之类的,语法检查,对象检查
三种写法
固定sql,绑定变量sql,硬编码sql
动态分别这三种
1 sql='select * from table where name='李三''
2 sql='select * from table where name=:p_name'
3 sql='select * from table where name='||p_name;
declare
vc_sql varchar2(1000);
i number;
begin
i := 10;
vc_sql := 'select /*+ demo 1*/ * from t where object_id=10';
execute immediate vc_sql;
vc_sql := 'select /*+ demo 2*/ * from t where object_id=:1';
execute immediate vc_sql using i;
vc_sql := 'select /*+ demo 3*/ * from t where object_id='||i;
execute immediate vc_sql;
i := 20;
vc_sql := 'select /*+ demo 1*/ * from t where object_id=10';
execute immediate vc_sql;
vc_sql := 'select /*+ demo 2*/ * from t where object_id=:1';
execute immediate vc_sql using i;
vc_sql := 'select /*+ demo 3*/ * from t where object_id='||i;
execute immediate vc_sql;
end;
/
sql> select sql_text from v$sqlarea where sql_text like 'select /*+ demo %' order by sql_text;
sql_text
------------------------------
select /*+ demo 1*/ * from t where object_id=10
select /*+ demo 1*/ * from t where object_id=20
select /*+ demo 2*/ * from t where object_id=:1
select /*+ demo 3*/ * from t where object_id=10
select /*+ demo 3*/ * from t where object_id=20
如果重复执行 条件不变的话 3种方式都能重用,
如果 条件发生变化,
第一种字面写死的能重用,
第二种 绑定变量 基本能重用 oracle 10g以后 会窥视变量的值, 如果存数据分布信息 可能重新生成执行计划.
第三种参数化 会因为条件值发生改变不发生重用,
静态sql语句 只是取消掉了引号的 ,没有execute immediate 基本跟上面形似一样