oracle 动态语句 三种写法

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  基本跟上面形似一样

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值