【发布时间】:2022-01-03 08:57:45
【问题描述】:
这是 ORACLE 文档提供的 PL/SQL 基本块的定义。
基本块是指PL/SQL代码的单入口单出口块
这是来自互联网的基本块的定义
基本块是一组始终按顺序执行的语句。基本块的特点是——它们不包含任何类型的跳转语句。中间没有分支或停止的可能性。所有语句都按照它们出现的顺序执行。
我正在尝试使用 DBMS_PLSQL_CODE_COVERAGE 包查找 PL/SQL 代码的代码覆盖率,该包允许查找 PL/SQL 块级覆盖率。这里我对 IF-ELSIF-ELSE 代码覆盖率有些疑问。最主要的是ELSE block of IF-ELSIF-ELSE is not considered as a basic block。请参考以下代码。
这是我的第一个例子。在第二列中,所有值(0 和 1)代表一个基本块。在这里你可以清楚地看到 IF 和 ELSE 条件都算作基本块,这对我来说是相当公平的。
现在,这让我很困扰。请参考以下代码。
这里你可以看到所有的 IF 和 ELSIF 块都算作基本块,这没关系。但是 ELSE 块不被认为是基本块,也就是说,根据基本块的定义,如果执行到最后一个 ELSIF 块,无论 ELSE 的哪个部分也被执行。这会影响代码覆盖率。
但在实际执行中,这不会发生。但是 DBMS_PLSQL_CODE_COVERAGE 包给了我这个输出。有人可以解释为什么会这样吗?我不知道这个包的内部实现。我所知道的是它使用 DBMS_PROFILER 来获取代码覆盖率。
如果您对此感到好奇,上面的表格提供给我的是哪个查询。
SELECT LISTAGG(ccb.col, ',') WITHIN GROUP (ORDER BY ccb.col) AS col,
LISTAGG(ccb.covered, ',') WITHIN GROUP (ORDER BY ccb.col) AS covered,
s.line,
LISTAGG(ccb.not_feasible, ',') WITHIN GROUP (ORDER BY ccb.col) AS not_feasible,
s.text
FROM user_source s
JOIN dbmspcc_units ccu ON s.name = ccu.name AND s.type = ccu.type
LEFT OUTER JOIN dbmspcc_blocks ccb ON ccu.run_id = ccb.run_id AND ccu.object_id = ccb.object_id AND s.line = ccb.line
WHERE s.name = 'DEMO_UTILITY_TST'
AND s.type = 'PACKAGE BODY'
AND ccu.run_id = 248
GROUP BY s.line, s.text
ORDER BY 3;
【问题讨论】:
-
没有 DDL 无法重现。
-
请检查是否在Function FOO docs.oracle.com/en/database/oracle/oracle-database/12.2/lnpls/…中使用了pragma COVERAGE
标签: sql oracle plsql code-coverage