1. 通过DBA_SOURCE定位SQL语句属于哪个存储过程 
  2.   
  3. 最近集中进行了一系列SQL优化,主要通过ADDM和AWR对捕捉COST或物理读、逻辑读很高的语句,问题的主要原因是全表扫描。但提交开发后开发反馈找不到SQL语句,因为属于存储过程。其实通过EDITPLUS全目录检索肯定能够找到该语句的位置,但为了便于日后定位,笔者还是通过ORACLE的dba_source视图进行了步骤。 
  4.  
  5. 什么是dba_source字典视图: 
  6. 存储所有函数、过程、程序包和Java源的完整的文本,对于你了解一个数据库对象的源代码很有用。存储过程在该视图中是以行为单位进行存储的。 
  7.   
  8. SAMPLE: 
  9. 问题sql语句 
  10. Select Count(*) 
  11. From Sample_Con_Sta_No Cs 
  12. Where Cs.Deleted_Flag = 0 And (Cs.In_Out_Group_Status != '1' And Cs.In_Out_Group_Status != '2'And 
  13.                             Cs.Con_Id In 
  14.                             (Select Con_Id 
  15.                             From Sample_Ent_Con Ec 
  16.                             Where Ec.Ent_Id In (Select Ent_Id From Sample_Ent_Con Ecc Where Ecc.Con_Id = :B1)) 
  17.   
  18. 定位方法: 
  19. 截取“Select Ent_Id From Sample_Ent_Con Ecc Where Ecc.Con_Id”去视图查询(注意dba_source视图中存储的是行为单位拆分的存储过程等对象,关键词太长肯定找不到) 
  20.   
  21. 查询语句: 
  22. Select * From dba_source Where text Like '%Select Ent_Id From Sample_Ent_Con Ecc%' 
  23.   
  24. 查询结果: 
  25. OWNER 
  26. NAME 
  27. TYPE 
  28. LINE 
  29. TEXT 
  30. SAMPLE 
  31. PKG_SAMPLE_CON_STATUS 
  32. PACKAGE BODY 
  33. 35 
  34. (Select Ent_Id From Sample_Ent_Con Ecc 
  35.  Where Ecc.Con_Id = v_Con_Id)); 
  36.   
  37. 分析: 
  38. 该语句在PKG_SAMPLE_CON_STATUS的35行 
  39.   
  40. 确认:如下存储过程35行确实有该行内容 
  41. CREATE OR REPLACE Package Body Pkg_Sample_Con_Status Is 
  42.      -- Private type declarations 
  43.      -- Private constant declarations 
  44.      -- Private variable declarations 
  45.      -- Function and procedure implementations 
  46.  
  47.      Function Func_Is_Over_Clearance_State(v_Con_Id In Number, v_Clearance_State In Varchar2) Return Number Is 
  48.          v_Num Number; 
  49.      Begin 
  50.          Select Count(*) 
  51.          Into v_Num 
  52.          From Sample_Ent_Status_Note 
  53.          Where Deleted_Flag = 0 And 
  54.                        Ent_Id In (Select Ent_Id From Sample_Ent_Con Where Con_Id = v_Con_Id) And 
  55.                        Clearance_State < v_Clearance_State; 
  56.          If v_Num > 0 Then 
  57.               Return 0; 
  58.          Else 
  59.               Return 1; 
  60.          End If; 
  61.      End Func_Is_Over_Clearance_State; 
  62.  
  63.      -- 判断 
  64.      Function Func_Is_All_Con_In(v_Con_Id In Number) Return Number Is 
  65.          v_Num Number; 
  66.      Begin 
  67.          Select Count(*) 
  68.          Into v_Num 
  69.          From Sample_Con_Sta_No Cs 
  70.          Where Cs.Deleted_Flag = 0 And (Cs.In_Out_Group_Status != '1' And Cs.In_Out_Group_Status != '2'And 
  71.                        Cs.Con_Id In 
  72.                        (Select Con_Id 
  73.                        From Sample_Ent_Con Ec 
  74.                        Where Ec.Ent_Id In 
  75.                                       (Select Ent_Id From Sample_Ent_Con Ecc Where Ecc.Con_Id = v_Con_Id)); 
  76.          If v_Num > 0 Then 
  77.               Return 0; 
  78.          Else 
  79.               Return 1; 
  80.          End If; 
  81.      End Func_Is_All_Con_In; 
  82.   
  83.