oracle - डीबीएमएस प्रोफाइलर के साथ एक पी एल/एसक्यूएल कवरेज रिपोर्ट तैयार करना




plsql code-coverage (2)

मैं अपने पीएल / एसक्यूएल पैकेजों की मूल रूपरेखा के लिए डीबीएमएस_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

मैं प्रत्येक प्रोफ़ाइलर चलाने से पहले plsql_profiler_data, plsql_profiler_units, plsql_profiler_runs तालिकाओं को साफ़ करता हूं ताकि मुझे प्रत्येक बार रन आईडी पता न हो।

यह मुझे पैकेज की जानकारी देगा जो उस कोड के प्रतिशत पर होगी जो कि प्रोफाइलिंग के दौरान कवर किया गया था। अब मैं यह देखने की कोशिश कर रहा हूं कि यह एक सामान्य कवरेज रिपोर्ट के रूप में बनाया जा सकता है, जहां मुझे पता चल सकता है कि कौन-सी पंक्ति का कोड कवर किया गया था और कौन सी नहीं था (कहां से चुनें लाइनऑफ़कोड, से खरीदा गया है ...) ताकि मैं html के साथ एक रिपोर्ट बना सकूं यह इंगित करने के लिए स्वरूपण है कि क्या कोई लाइन कवर थी या नहीं

ओरेकल टेबल संरचनाओं में मैं बहुत कुशल नहीं हूं, जहां कार्य और प्रक्रियाएं बचाई जाती हैं। (एक ब्लॉग से उपरोक्त प्रश्न प्राप्त करें और रन आईडी को हटाने के लिए थोड़ा संशोधित करें)

क्या यह संभव है?

यदि हां, तो मैं इसे कैसे प्राप्त कर सकता हूं?


मुझे लगता है कि इस दृष्टिकोण के बाद आप क्या कर रहे हैं:

-- 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 कॉलम में सटीक मान नहीं होगा क्योंकि वे टाइमर के रिज़ॉल्यूशन से तेज़ी से निष्पादित किए हैं।

टॉम से पूछें: समय :

समय की कुछ इकाई का उपयोग करके समय एकत्र किया जाता है, आमतौर पर केवल एचएसईसीएस के दानेदार।

इसका अर्थ है कि बहुत से असतत घटनाएं जो दूसरे के कम से कम 1/100 वीं लेती हैं, शून्य सेकंड लेती हैं।

कई असतत घटनाएं जो एक दूसरे के कम / 1 100/100 सेकंड्स लेती हैं, एक सेकंड के 1/100 वीं ले सकती हैं।

2) केवल एक बहुरेखित बयान में पहली पंक्ति को कवर के रूप में दिखाया जाएगा। इसलिए यदि आप INSERT या जो भी कई पंक्तियों में विभाजित करते हैं, तो मुझे रिपोर्ट के किसी एनोटेट सोर्स शैली के रूप में दिखाए जाने के लिए उस कथन की हर पंक्ति के किसी भी आसान तरीके से नहीं पता है।

साथ ही, एकत्र किए गए प्रोफाइलर डेटा के विरुद्ध मदद क्र ाफ्टिंग क्वेरी के लिए ओरेकल के डीबीएमएस_प्रॉफ़र दस्तावेज़ और इस उपयोगी पैकेज संदर्भ की जांच करें।


असल में पीएल / एसक्यूएल के लिए कुछ उपकरण हैं जो कोड कवरेज करते हैं। अधिक जानकारी के लिए इस प्रश्न के उत्तर देखें।

यह कहा गया है, आप निम्न टेबल में उपयोगकर्ता निर्मित डेटा संरचना और कोड के बारे में जानकारी पा सकते हैं:

  • user_source : यहां आप स्रोत, कार्य, प्रक्रिया, पैकेज इत्यादि द्वारा टाइप किए गए user_source फ़ील्ड में पा सकते हैं।
  • User_tables
  • user_indexes
  • user_types : यदि आप किसी प्रकार का ओओ कोड का उपयोग करते हैं
  • user_ शुरू होने वाली अन्य टेबल जिन्हें आपको आवश्यकता हो सकती है

असल में आपको user_source विरुद्ध अपनी क्वेरी का परिणाम user_source और अन्य तालिकाओं से अतिरिक्त जानकारी प्राप्त करना होगा।





profiler