因为经常要观察生产环境的性能问题,所以经常要用v$sql去查sql,如果你也是经常用这个视图的话,你会发现明明刚执行了一些sql,怎么就找不到?。我这里就举几个例子说明下:
CREATE OR REPLACE PROCEDURE MY_test IS
v_cnt NUMBER;
BEGIN
SELECT COUNT(1) INTO v_cnt FROM a ;
END;
你执行这个存储过程
BEGIN
my_test;
END;
如果你用 into v_cnt 去v$sql搜索,你会看不到SELECT COUNT(1) INTO v_cnt FROM a 这个SQL,我们看下,这个SQL在V$SQL里面存成什么样子
可以清楚看到,存到v$sql里面的sql,它是省去了 INTO V_CNT这种赋值部分的。
修改存储过程,加上注释语句和别名,看是否能识别出来
CREATE OR REPLACE PROCEDURE MY_test IS
v_cnt NUMBER;
BEGIN
SELECT/*MMMMMM*/ COUNT(1) INTO v_cnt FROM a tt;
END;
同样执行下这个存储过程,再去看这个sql存成什么样子
可以看到,别名TT被保留了,你的注释语句不见了,所以,如果你为了想查找方便,在sql里加些注释,那就是白费力气。
以上的情况只是在存储过程或包里的sql才适用,如果你单独写sql,你写成什么样子,就跟你存成什么样子,这也是个很重要的区别
单独执行sql
SELECT/*mmmmmmm*/* FROM b
这个时候你用/*mmmmm*/是可以找到你的sql的
通过上面几个例子,你也许还发现了一个规律,就是单独的sql不会转换你的大小写,而包或存储过程里面的sql,全部跟你转换成了大写!
以上就是我发现的一些规律,希望对大家有用,要是哪位高手知道为什么会这样,请赐教。。。。