我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!
由于博客中有大量代码,通过页面浏览效果更佳。
脚本的获取请关注公众号,回复脚本就可以获得方法。
在前面几天我们写了SQL优化必备脚本:Oracle获取绑定变量的字面SQL文本,其中有网友反馈在SQL中timestamp列返回空置和有两个date类型的列式,会出现将之间:1识别为绑定变量的方式。
关于timestamp返回空值,这个是由于V$SQL_BIND_CAPTURE的机制导致的,详细信息可以查考Mos:444551.1,关于SQL语句中有:1这种值时,会被识别绑定量来替代,所以此时会返回错误的结果。
现象的模拟
declare
b1 DATE := to_date('05/11/2025 15:19:56', 'mm/dd/yyyy hh24:mi:ss');
b2 timestamp:=to_timestamp('05/11/2025 15:19:56', 'mm/dd/yyyy hh24:mi:ss');
begin
execute immediate q'[select count(*) from t1 where created>:2 and last_ddl_time<:1 ]' using b2,b1;
end;
/
脚本返回的结果如下:
SYS@HTZ@ARM19C> @sql_fulltext_by_sqlid.sql
Enter value for sqlid: 8xsugjwa5k75z
SYS
select count(*) from t1 where created>NULL and last_ddl_time<'05/11/2025 15:19:56'
PL/SQL procedure successfully completed.
修复的思路
timestamp按照Mos的解决方案修复即可。
关于:1这种现象采用的是识别常亮值,也就是不替换”中的任何内容即可,这个时候需要我们自己写一个函数来实现。
修复的效果
修复后的脚本执行结果如下:
SYS@HTZ@ARM19C> @sql_fulltext_by_sqlid.sql
Enter value for sqlid: 8xsugjwa5k75z
SYS
select count(*) from t1 where created>'2025-05-11 15:19:56.000000000' and last_ddl_time<'05/11/2025 15:19:56'
PL/SQL procedure successfully completed.
这个问题就修复到这个,如果大家在执行过程中,还有问题请随时在群里面反馈,我这边会及时的修复。
更多跟性能相关的脚本
Oracle DBA必备脚本:一秒就定位千行执行计划的SQL慢在哪一步
SQL优化必备脚本:Oracle获取绑定变量的字面SQL文本
Oracle DBA必备脚本:一键获取SQL性能数据,快速定位性能拐点
DBA必备脚本:一键获得SQL访问的表及对应的索引,可协助快速定位SQL性能瓶颈
——————作者介绍———————–
姓名:黄廷忠
现就职:Oracle中国高级服务团队
曾就职:OceanBase、云和恩墨、东方龙马等
电话、微信、QQ:18081072613
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)
DBA必备脚本:Oracle获取绑定变量的字面SQL文本版版本替代:等您坐沙发呢!