programing

DBMS Profiler를 사용한 PL/SQL 커버리지 보고서 구축

telebox 2023. 10. 24. 21:16
반응형

DBMS Profiler를 사용한 PL/SQL 커버리지 보고서 구축

저는 PL/SQL 패키지의 기본 프로파일링을 위해 DBMS_PROFILER를 사용하고 있습니다.또한 다음 쿼리를 사용하여 코드 커버리지 통계를 가져오는 데에도 사용하고 있습니다.

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

매번 run id를 알 필요가 없도록 각 프로파일러가 실행되기 전에 plsql_profiler_data, plsql_profiler_units 테이블을 지웁니다.

이렇게 하면 프로파일링 중에 적용된 코드 비율에 대한 패키지 정보를 얻을 수 있습니다.이제 저는 이것이 어떤 라인의 코드가 적용되었는지, 어떤 라인이 적용되지 않았는지(예를 들어 select lineOfCode, covered from...) 알 수 있는 정상적인 적용 범위 보고서로 구축할 수 있는지 확인하려고 합니다. 그래서 라인이 적용되었는지 여부를 나타내는 html 형식의 보고서를 구축할 수 있습니다.

저는 함수와 프로시저가 저장되는 위치 등에 대한 오라클 테이블 구조에 너무 능숙하지 않습니다. (블로그에서 위의 쿼리를 받고 run id를 제거하기 위해 약간 수정됨)

가능한가요?

그렇다면 어떻게 해야 이걸 이룰 수 있을까요?

편집: 이미 DBMS Profiler를 사용하고 있는 PL/SQL의 코드 적용 범위와 다릅니다.제 질문은 보고서 작성에 관한 것이었습니다.

내 생각엔 이게 당신이 원하는 것에 가까워진 것 같습니다.

-- 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그들이 타이머의 해상도보다 더 빨리 실행했기 때문에 column.

Tomre에게 묻기: 시간:

타이밍은 특정 시간 단위를 사용하여 수집되며, 일반적으로 HSEC에만 세분화됩니다.

즉, 100분의 1초 미만의 시간이 소요되는 많은 이산 이벤트는 0초가 소요되는 것으로 나타납니다.

100분의 1초 미만이 소요되는 많은 개별 이벤트는 100분의 1초가 소요되는 것으로 나타날 수 있습니다.

2) 다중 행 문의 FIRST 행만 표지된 것으로 표시됩니다.그래서 만약 당신이 분열한다면.INSERT또는 여러 줄에 걸쳐 있는 것이 무엇이든 간에, 저는 주석이 달린 출처 스타일의 보고서에 해당 문장의 모든 줄이 프로파일로 표시되도록 할 수 있는 쉬운 방법을 알지 못합니다.

또한 Oracle의 dbms_profiler 설명서와 이 유용한 패키지 참조를 참조하여 수집된 프로파일러 데이터에 대한 쿼리를 만드는 데 도움이 됩니다.

실제로 코드 커버리지를 수행하는 PL/SQL용 도구들이 있습니다.자세한 내용은 이 질문에 대한 답변을 참조하십시오.

이와 같이 사용자가 작성한 데이터 구조 및 코드에 대한 정보는 다음 표에서 확인할 수 있습니다.

  • user_source: 여기서 당신은 출처를 찾을 수 있습니다.TEXT기능, 프로시저, 패키지 등에 의해 유형화된 필드.
  • User_tables
  • user_indexes
  • user_types OO코드를 사용한다면.
  • 다른 표는 다음으로 시작합니다.user_필요하실 수도 있습니다.

기본적으로 당신은 당신의 질문의 결과를 확인할 필요가 있을 것입니다.user_source다른 테이블에서 더 많은 정보를 얻을 수 있습니다.

언급URL : https://stackoverflow.com/questions/17874131/building-a-pl-sql-coverage-report-with-dbms-profiler

반응형