您好,我是小DAI,专注于数据库管理员相关的技术问答,请问有什么可以帮您?

SQLScript 代码覆盖范围

描述

SAP HANA 将代码覆盖会话的结果存储在 M_SQLSCRIPT_CODE_COVERAGE_RESULTS 监控视图中,并将代码覆盖会话期间使用的对象定义存储在 M_SQLSCRIPT_CODE_COVERAGE_OBJECT_DEFINITIONS 监控视图中。

语法

要启动 SQLScript 代码覆盖范围:

ALTER SYSTEM START SQLSCRIPT CODE COVERAGE

[ FOR DEBUG TOKEN ]

[ FOR USER ]

[ FOR APPLICATION USER ]

[ FOR SESSION ]

要停止 SQLScript 代码覆盖范围:

ALTER SYSTEM STOP SQLSCRIPT CODE COVERAGE

语法元素

:指定代码覆盖范围适用的令牌。

:指定代码覆盖范围适用的数据库用户 ID。

:指定代码覆盖范围适用的应用程序用户的标识。

:指定应用代码覆盖范围的会话的 ID。

随时从监控视图中进行选择,并从任何列开始代码覆盖范围后感兴趣。但是,代码覆盖运行的完整内容仅在第二个会话中触发的查询(已涵盖)完成后可见(如下面的第二个示例中所述)。

每次停止 SQLScript 代码覆盖会话并启动新会话时,这些视图中的内容都会被覆盖。由于数据是临时的,因此在执行 ALTER SYSTEM STOP SQLSCRIPT CODE COVERAGE 之前,从这些视图中复制或导出内容以保留 SQLScript 代码覆盖会话记录的数据。

要覆盖代码,必须至少有两个连接。在第一个会话中执行运行代码覆盖范围的代码,并在第二个会话中为特定连接标识启动代码覆盖范围以记录覆盖范围。

注意您必须具有 EXECUTE、DEBUG 和 ATTACH_DEBUGGER 权限才能执行代码覆盖。

示例

SAP HANA 需要两个会话来执行代码覆盖。以下示例使用会话 A 执行运行代码覆盖的代码,会话 B 启动特定连接 ID 的代码覆盖以记录覆盖范围。

  1. 在任一会话中创建 limitedLoop 和 dummy_proc 过程:CREATE PROCEDURE limitedLoop() ASBEGINDECLARE i BIGINT := 0;LOOPi := i + 1;IF :i > 27 THENBREAK;END IF;END LOOP;END;CREATE PROCEDURE dummy_proc() ASBEGINSELECT * FROM DUMMY;CALL limitedLoop();END;

  1. 从会话 A 发出此命令以确定连接 ID:SELECT SESSION_CONTEXT('CONN_ID') FROM DUMMY;

  1. 在会话 B 中,通过使用在会话 A 中执行代码的用户的连接 ID 启动代码覆盖(此示例使用连接 ID 203247):ALTER SYSTEM START SQLSCRIPT CODE COVERAGE FOR SESSION '203247';

  1. 从会话 A 调用 dummy_proc 过程:CALL dummy_proc();

  1. 在会话 B 中,通过查询 M_SQLSCRIPT_CODE_COVERAGE_RESULTS 和 M_SQLSCRIPT_CODE_COVERAGE_OBJECT_DEFINITIONS 监控视图查看代码覆盖范围SELECT * FROM M_SQLSCRIPT_CODE_COVERAGE_RESULTS;SELECT * FROM M_SQLSCRIPT_CODE_COVERAGE_OBJECT_DEFINITIONS; 如果需要,存储监控视图的内容以供将来参考(可以是常规临时表或本地临时表): CREATE LOCAL TEMPORARY TABLE "#SomeTableName" AS (SELECT * FROM M_SQLSCRIPT_CODE_COVERAGE_RESULTS) WITH DATA;

  1. 从会话 B 中,禁用代码覆盖范围(这也会清除现有代码覆盖范围):ALTER SYSTEM STOP SQLSCRIPT CODE COVERAGE;