[20120414]存储过程递归调用与V$SQL.txt-阿里云开发者社区

开发者社区> lfreeali> 正文

[20120414]存储过程递归调用与V$SQL.txt

简介: [20120414]存储过程递归调用与V$SQL.txt如果存储过程存在递归调用看看能否在v$SQL中有记录呢?前一阵子跟踪程序,优化sql语句的过程中,发现在存储过程中再调用存储过程,v$sql中体现不出来。
+关注继续查看
[20120414]存储过程递归调用与V$SQL.txt

如果存储过程存在递归调用看看能否在v$SQL中有记录呢?前一阵子跟踪程序,优化sql语句的过程中,
发现在存储过程中再调用存储过程,v$sql中体现不出来。

写一个例子如下:
CREATE or replace  PROCEDURE testfindme( flag  VARCHAR2) as
BEGIN
    IF flag = '1' THEN
        dbms_output.put_line ('flag='||flag);
    END IF;
    IF flag = '2' THEN
        dbms_output.put_line ('flag='||flag);
        testfindme('1');
    END IF;
END;
/


SQL> select * from v$version ;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0      Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production


1.检查是否存在:
SELECT sql_text, sql_id, executions, plsql_exec_time, is_obsolete, is_bind_sensitive, is_bind_aware, is_shareable
  FROM v$sql
 WHERE lower(sql_text) LIKE '%testfindme%' AND lower(sql_text) NOT LIKE '%v$sql%';

no rows selected


2.测试,如果我执行exec testfindme('2'),可以确定存储过程会调用testfineme('1').

SQL> set SERVEROUT on
SQL> column sql_text format a30
SQL> column is_obsolete format a10
SQL> column is_bind_sensitive format a10
SQL> column is_bind_aware format a10
SQL> column is_shareable format a10
SQL> exec testfindme('2');
flag=2
flag=1

SQL> SELECT sql_text, sql_id, executions, plsql_exec_time, is_obsolete, is_bind_sensitive, is_bind_aware, is_shareable
  FROM v$sql
 WHERE lower(sql_text) LIKE '%testfindme%' AND lower(sql_text) NOT LIKE '%v$sql%';
SQL_TEXT                       SQL_ID        EXECUTIONS PLSQL_EXEC_TIME IS_OBSOLET IS_BIND_SE IS_BIND_AW IS_SHAREAB
------------------------------ ------------- ---------- --------------- ---------- ---------- ---------- ----------
BEGIN testfindme('2'); END;    ahw3y5yzbjkg6          1             177 N          N          N          Y

--可以发现并没有调用testfindme('1')的情况。再执行一次:

SQL> exec testfindme('2');
flag=2
flag=1

PL/SQL procedure successfully completed.

SQL> SELECT sql_text, sql_id, executions, plsql_exec_time, is_obsolete, is_bind_sensitive, is_bind_aware, is_shareable
  FROM v$sql
     WHERE lower(sql_text) LIKE '%testfindme%' AND lower(sql_text) NOT LIKE '%v$sql%';
SQL_TEXT                       SQL_ID        EXECUTIONS PLSQL_EXEC_TIME IS_OBSOLET IS_BIND_SE IS_BIND_AW IS_SHAREAB
------------------------------ ------------- ---------- --------------- ---------- ---------- ---------- ----------
BEGIN testfindme('2'); END;    ahw3y5yzbjkg6          2             301 N          N          N          Y

--奇怪并没有记录testfindme('1') 的语句。可以发现存储过程存在递归调用在V$SQL中并没有体现出来!

查询基表:(sys用户执行)
SQL> column KGLNAOBJ format a30
SQL> SELECT addr, indx, inst_id, kglhdpar, kglnaobj FROM SYS.x$kglob WHERE lower(KGLNAOBJ) like 'begin%testfindme%';
SQL> SELECT addr, indx, inst_id, kglhdpar, kglnaobj FROM SYS.x$kglob WHERE lower(KGLNAOBJ) like 'begin%testfindme%';
ADDR                   INDX    INST_ID KGLHDPAR         KGLNAOBJ
---------------- ---------- ---------- ---------------- ------------------------------
0000002A97467208       1402          1 00000000994F0D10 BEGIN testfindme('2'); END;
0000002A971CB900       1403          1 00000000994F0D10 BEGIN testfindme('2'); END;

3.我执行testfindme('1') 看看结果如何?
SQL> exec testfindme('1');
flag=1
PL/SQL procedure successfully completed.

SQL> SELECT sql_text, sql_id, executions, plsql_exec_time, is_obsolete, is_bind_sensitive, is_bind_aware, is_shareable
  FROM v$sql
   WHERE lower(sql_text) LIKE '%testfindme%' AND lower(sql_text) NOT LIKE '%v$sql%';
SQL_TEXT                       SQL_ID        EXECUTIONS PLSQL_EXEC_TIME IS_OBSOLET IS_BIND_SE IS_BIND_AW IS_SHAREAB
------------------------------ ------------- ---------- --------------- ---------- ---------- ---------- ----------
BEGIN testfindme('1'); END;    5d8ga1jv253gj          1             111 N          N          N          Y
BEGIN testfindme('2'); END;    ahw3y5yzbjkg6          2             301 N          N          N          Y

3.再建立一个新的存储过程
CREATE or replace  PROCEDURE testfindmea( flag  VARCHAR2) as
BEGIN
    dbms_output.put_line ('flag='||flag);
    testfindme('2');
END;
/

SQL> exec testfindmea('3');
flag=3
flag=2
flag=1

PL/SQL procedure successfully completed.


SQL> SELECT sql_text, sql_id, executions, plsql_exec_time, is_obsolete, is_bind_sensitive, is_bind_aware, is_shareable
  FROM v$sql
   WHERE lower(sql_text) LIKE '%testfindme%' AND sql_text NOT LIKE '%v$sql%';
SQL_TEXT                       SQL_ID        EXECUTIONS PLSQL_EXEC_TIME IS_OBSOLET IS_BIND_SE IS_BIND_AW IS_SHAREAB
------------------------------ ------------- ---------- --------------- ---------- ---------- ---------- ----------
BEGIN testfindme('1'); END;    5d8ga1jv253gj          1             111 N          N          N          Y
BEGIN testfindme('2'); END;    ahw3y5yzbjkg6          2             301 N          N          N          Y
SELECT addr, indx, inst_id, kg 5drw5vqu56szv          2               0 N          N          N          Y
lhdpar, kglnaobj FROM SYS.x$kg
lob WHERE lower(KGLNAOBJ) like
 'begin%testfindme%'
BEGIN testfindmea('3'); END;   95975a87vmb3b          1             184 N          N          N          Y

--从EXECUTIONS看,虽然testfindmea('3')调用了testfindme('2')和testfindme('1'),但是在V$SQL中并没有体现出来。

可以发现存储过程存中调用其它存储过程在V$SQL中并没有体现出来!在优化存储过程中给注意一下!



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
通过存储过程进行分页查询的SQL示例
--创建人:zengfanlong --创建时间:2014-7-28 10:51:15 --说明:根据公司简写代码获取当前待同步的气瓶档案数据(分页获取) ALTER PROCEDURE [UP_GasBottles_GetSyncData_ByPage] ( @C...
614 0
Spring调用存储过程
public Boolean bindCard(final BindCardProfile bindCardProfile) throws DataAccessException { if (bindCardProfile == null) { return false; } String dbRetu
1097 0
mysql 创建事件及调用
mysql 创建事件及调用 创建事件 CREATE EVENT 的语法如下: CREATE EVENT [IF NOT EXISTS] ---------------------------------------------*标注1 event_name -----------------.
1174 0
SQL Server 在多个数据库中创建同一个存储过程(Create Same Stored Procedure in All Databases)
原文:SQL Server 在多个数据库中创建同一个存储过程(Create Same Stored Procedure in All Databases) 一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 遇到的问题(Problems)...
1180 0
关于shell调用MySQL存储过程的问题
前天收到一个任务,要统计每天ETL的运行情况,感觉每天从给的SQL语句一个一个的查询影响效率。 就行用写一个存储过程来实现,然后通过shell调用这个存储过程来自动跑数据,写到相应的文件里~ 思路就是这样,废话不说,上一下写好的代码。 DELIMITER // create procedure sp_etl_info_day (in statis_date int) begin
1933 0
SQL2000系统表、存储过程、函数的功能介绍及应用
转自:http://blog.csdn.net/zlp321002/article/details/480925 ----系统表---------------------------------------------------------------------------------------------------- 虽然使用系统存储过程、系统函数与信息架构视图已经可以为我们提供了相当丰富的元数据信息,但是对于某些特殊的元数据信息,我们仍然需要直接对系统表进行查询。
630 0
+关注
lfreeali
熟悉oracle数据库性能优化,rman备份,数据库恢复技术.
2055
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载