oracle 使用DBMS Profiler构建PL/SQL覆盖率报告[重复]

92vpleto  于 2023-06-05  发布在  Oracle
关注(0)|答案(2)|浏览(209)

此问题已在此处有答案

Code coverage for PL/SQL(6个答案)
8天前关闭
截至6天前,社区正在审查是否重新讨论这个问题。
我使用DBMS_PROFILER对我的PL/SQL包进行基本分析。我还使用它通过以下查询获取代码覆盖率统计信息:

SELECT EXEC.unit_name unitname,ROUND (EXEC.cnt/total.cnt * 100, 1) Code_coverage FROM 
    (SELECT u.unit_name, COUNT(1) cnt FROM plsql_profiler_data d, plsql_profiler_units u WHERE u.unit_number = d.unit_number GROUP BY u.unit_name) total, 
    (SELECT u.unit_name, COUNT(1) cnt FROM plsql_profiler_data d, plsql_profiler_units u WHERE u.unit_number = d.unit_number AND d.total_occur > 0 GROUP BY u.unit_name) EXEC 
    WHERE EXEC.unit_name = total.unit_name

我在每个分析器运行之前清除plsql_profiler_data、plsql_profiler_units、plsql_profiler_runs表,这样就不需要每次都知道运行id。
这将为我提供有关在分析期间覆盖的代码百分比的软件包信息。现在,我试图看看这是否可以作为一个正常的覆盖率报告,在那里我可以知道哪一行代码被覆盖,哪一行没有(比如说选择lineOfCode,iscovered from...),这样我就可以用html格式来构建一个报告,以指示一行代码是否被覆盖。
我不太精通Oracle的表结构,不太了解函数和过程保存在哪里等。(从博客中获得上述查询,并稍微修改以删除运行ID)
这可能吗?
如果是这样,我如何才能做到这一点?
编辑:这与Code coverage for PL/SQL不同,我已经在使用DBMS Profiler。我的问题是关于构建报告。

ufj5ltwl

ufj5ltwl1#

我想这是你追求的目标:

-- View lines of code profiled, along with run times, next to the complete, ordered source..
-- Provides an annotated view of profiled packages, procs, etc.
-- Only the first line of a multiline SQL statement will register with timings.
SELECT u.UNIT_OWNER || '.' || u.UNIT_NAME AS "Unit"
  , s.line
  , CASE WHEN d.TOTAL_OCCUR >= 0 THEN 'C'
    ELSE ' ' END AS Covered
  , s.TEXT
  , TO_CHAR(d.TOTAL_TIME / (1000*1000*1000), 'fm990.000009') AS "Total Time (sec)"
  , CASE WHEN NVL(d.TOTAL_OCCUR, 1) > 0 THEN d.TOTAL_OCCUR ELSE 1 END AS "# Iterations"
  , TO_CHAR(CASE WHEN d.TOTAL_OCCUR > 0 THEN d.TOTAL_TIME / (d.TOTAL_OCCUR * (1000*1000*1000))
    ELSE NULL END, 'fm990.000009') AS "Avg Time (sec)"
FROM all_source s 
  LEFT JOIN plsql_profiler_units u ON s.OWNER = u.UNIT_OWNER
    AND s.NAME = u.UNIT_NAME
    AND s.TYPE = u.UNIT_TYPE
  LEFT JOIN plsql_profiler_data d ON u.UNIT_NUMBER = d.UNIT_NUMBER
    AND s.LINE = d.LINE#
    AND d.RUNID = u.RUNID
WHERE u.RUNID = ? -- Add RUNID of profiler run to investigate here 
ORDER BY u.UNIT_NAME
  , s.LINE

有几个问题需要记住。
1)plsql_profiler_data表中的许多行在其TOTAL_TIME列中将NOT具有准确的值,因为它们的执行速度比计时器的分辨率快。
Ask Tom re:timings:
使用一些时间单位来收集定时,通常仅粒度到HSECS。
这意味着许多离散事件,需要不到1/100秒,似乎需要零秒。
许多花费不到1/100秒的离散事件可能看起来花费1/100秒。
2)多行语句中只有FIRST行显示为已覆盖。因此,如果您将INSERT或其他内容拆分为多行,我不知道有什么简单的方法可以将该语句的 * 每 * 行显示为注解源代码风格的报告。
此外,请查看Oracle的dbms_profiler文档和this有用的包参考,以帮助根据收集的profiler数据制作查询。

5kgi1eie

5kgi1eie2#

实际上,有一些PL/SQL工具可以进行代码覆盖。有关详细信息,请参阅此question的答案。
也就是说,您可以在下表中找到有关用户创建的数据结构和代码的信息:

  • user_source:在这里,您可以在TEXT字段中找到源代码,其代表为function、procedure、package等。
  • User_tables
  • user_indexes
  • user_types:如果你使用某种OO代码。
  • 您可能需要的以user_开头的其他表。

基本上,您需要检查针对user_source的查询结果,并从其他表中获取额外的信息。

相关问题