salida procedimientos procedimiento parametros funciones example español ejemplos ejecutar developer con almacenado 11g oracle plsql code-coverage profiler

oracle - procedimientos - Elaboración de un informe de cobertura PL/SQL con DBMS Profiler



pl sql oracle (2)

Estoy usando DBMS_PROFILER para el perfil básico de mis paquetes PL / SQL. También lo estoy usando para obtener estadísticas de cobertura de código usando la siguiente consulta:

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

Borro las tablas plsql_profiler_data, plsql_profiler_units, plsql_profiler_runs antes de que cada profiler se ejecute, por lo que no necesito conocer el ID de ejecución cada vez.

Esto me proporcionará información sobre paquetes sobre el porcentaje de código que se cubrió durante el perfil. Ahora estoy tratando de ver si esto se puede construir como un informe de cobertura normal, donde puedo saber qué línea de código se cubrió y cuál no (por ejemplo, seleccionar lineOfCode, iscovered from ...) para que pueda crear un informe con html formateo para indicar si una línea estaba cubierta o no.

No soy muy competente en las estructuras de tablas de Oracle en las que se guardan las funciones y los procedimientos, etc. (Obtuve la consulta anterior de un blog y la modifiqué ligeramente para eliminar los ID de ejecución)

es posible?

Si es así, ¿cómo puedo lograr esto?


Creo que esto se acerca a lo que buscas:

-- 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

Hay algunos problemas a tener en cuenta.

1) Muchas filas en la tabla plsql_profiler_data NO tendrán valores precisos en su columna TOTAL_TIME porque se ejecutaron más rápido que la resolución del temporizador.

Pregunta a Tom re: timings :

Los tiempos se recopilan usando una unidad de tiempo, generalmente solo granular al HSECS.

Eso significa que muchos eventos discretos que toman menos de 1/100 de segundo parecen tomar CERO segundos.

Muchos eventos discretos que toman menos de 1/100 de segundo pueden parecer tomar 1/100 de segundo.

2) Solo la PRIMERA línea en una declaración de líneas múltiples aparecerá como cubierta. Entonces, si divide un INSERT o lo que sea en múltiples líneas, no conozco ninguna manera fácil de mostrar cada línea de esa declaración como se describe en un estilo de informe de Fuente anotada.

Además, consulte la documentación dbms_profiler de Oracle y esta útil referencia de paquete para ayudar a crear consultas con los datos recopilados del generador de perfiles.


En realidad, hay algunas herramientas para PL / SQL que cubren el código. Vea las respuestas a esta pregunta para más información.

Dicho esto, puede encontrar información sobre la estructura y el código de datos creados por el usuario en las siguientes tablas:

  • user_source : aquí puede encontrar la fuente en el campo TEXT tipificado por función, procedimiento, paquete, etc.
  • User_tables
  • user_indexes
  • user_types : si usas algún tipo de código OO.
  • Otras tablas que comiencen con user_ que pueda necesitar.

Básicamente, necesitaría verificar el resultado de su consulta en contra de user_source y obtener información adicional de las otras tablas.