如何确定系统中存在没有绑定变量的情况

如何确定系统中存在没有绑定变量的情况,可以使用ASKTOM网站提供的remove_constants()函数查看共享池中SQL运行情况
create or replace function remove_constants(p_query in varchar2) return varchar2
is
    l_query long;
    l_char varchar2(1);
    l_in_quotes boolean default FALSE;
begin
    for i in 1.. length(p_query)
    loop
   l_char := substr(p_query,i,1);
      if (l_char = '''' and l_in_quotes)
      then
       l_in_quotes := FALSE;
   elsif (l_char = '''' and NOT l_in_quotes)
   then
      l_in_quotes := TRUE;
       l_query := l_query || '''#';
    end if;
   if (NOT l_in_quotes) then
       l_query := l_query || l_char;
    end if;
  end loop;
    l_query := translate(l_query,'0123456789','@@@@@@@@@@');
    for i in 0 .. 8 loop
   l_query := replace(l_query,lpad(
'@',10-i,'@'),'@');
    l_query := replace(l_query,lpad(' ',10-i,' '),' ');
    end loop;
    return upper(l_query);
end;
 
 
如何使用?
--建表T用于测试
create table t (x int primary key);
insert into t select rownum from user_objects;
commit;

--不使用绑定变量测试
begin
 for i in 1..1000 loop
  execute immediate 'select * from t where x=' || i;
 end loop;
end; 

--建表T1用于保存共享池中的SQL
create table t1 as select sql_text from v$sqlarea;
--保存经过函数remove_constants()处理过的SQL
alter table t1 add sql_text_wo_constants varchar2(1000);
update t1 set sql_text_wo_constants = remove_constants(sql_text);
--经过函数remove_constants()处理后,SQL中的谓词被替换成@
select sql_text_wo_constants,count(*) from t1 group by sql_text_wo_constants having count(*) > 10;--数字可以自己改成其他
这样就知道哪些SQL没有绑定变量了。
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值