2013-07-26 29 views
9

Tôi đang sử dụng DBMS_PROFILER để lược tả cơ bản các gói PL/SQL của mình. Tôi cũng đang sử dụng nó để có được thống kê mã số bảo hiểm bằng cách sử dụng truy vấn sau đây:Tạo báo cáo vùng phủ sóng PL/SQL với 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 

tôi xóa plsql_profiler_data, plsql_profiler_units, plsql_profiler_runs bảng trước mỗi profiler chạy vì vậy mà tôi không cần phải biết chạy id mỗi lần.

Điều này sẽ cung cấp cho tôi thông tin gói khôn ngoan về tỷ lệ mã được bao gồm trong quá trình lập hồ sơ. Bây giờ tôi đang cố gắng để xem nếu điều này có thể được xây dựng như là một báo cáo bảo hiểm bình thường, nơi tôi có thể biết được dòng mã đã được bảo hiểm và một trong những wasnt (nói chọn lineOfCode, được phát hiện từ ...) để tôi có thể xây dựng một báo cáo với html định dạng để cho biết liệu một dòng có được bao phủ hay không.

Tôi không quá thành thạo trong các cấu trúc bảng Oracle vào nơi hàm và thủ tục được lưu vv (Got các truy vấn trên từ một blog và chút thay đổi để loại bỏ id chạy của)

Đây có phải là có thể?

Nếu vậy làm thế nào tôi có thể đạt được điều này?

+0

Xem điều này có giúp ích: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:458240723799 – Slartibartfast

Trả lời

0

Thực ra có một số công cụ cho PL/SQL thực hiện bảo vệ mã. Xem câu trả lời cho số question này để biết thêm thông tin.

Nói điều này, bạn có thể tìm thông tin về người sử dụng tạo ra cấu trúc dữ liệu và mã số trong bảng sau đây:

  • user_source: ở đây bạn có thể tìm ra nguồn trong TEXT lĩnh vực đặc trưng bởi hàm, thủ tục, đóng gói, vv
  • User_tables
  • user_indexes
  • user_types: nếu bạn sử dụng một số loại mã OO.
  • Các bảng khác bắt đầu bằng user_ mà bạn có thể cần.

Về cơ bản, bạn cần kiểm tra kết quả truy vấn của mình theo số user_source và nhận thêm thông tin từ các bảng khác.

+0

hầu hết các câu trả lời trong liên kết đó trỏ tới DBMS_PROFILER, truy vấn được đưa ra hầu như giống với truy vấn tôi đã hiển thị trong câu hỏi. Hai liên kết khác không trông rất hứa hẹn. Do đó câu hỏi này. Sẽ kiểm tra user_source để xem nếu nó có thể giúp đỡ – rajesh

1

Tôi nghĩ rằng đây tiếp cận gì bạn đang sau:

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

Có vài vấn đề cần lưu ý.

1) Nhiều hàng trong bảng plsql_profiler_data sẽ KHÔNG có giá trị chính xác trong cột TOTAL_TIME của họ, vì họ thực thi nhanh hơn so với độ phân giải của bộ đếm thời gian.

Ask Tom re: timings:

Các timings được thu thập bằng một số đơn vị thời gian, thường chỉ hạt đến HSECS.

Điều đó có nghĩa là nhiều sự kiện rời rạc mất ít nhất 1/100th của giây, dường như mất 0 giây.

Nhiều sự kiện rời rạc mất ít nhất 1/100 giây có thể xuất hiện để mất 1/100 giây.

2) Chỉ dòng FIRST đầu tiên trong câu lệnh nhiều dòng sẽ hiển thị như được đề cập. Vì vậy, nếu bạn chia một số INSERT hoặc bất kỳ điều gì trên nhiều dòng, tôi không biết bất kỳ cách nào dễ dàng để có mỗi dòng của câu lệnh đó để hiển thị dưới dạng được lược tả trong kiểu báo cáo Nguồn được chú thích.

Ngoài ra, hãy xem tài liệu dbms_profiler của Oracle và tham chiếu gói hữu ích this để giúp tạo các truy vấn đối với dữ liệu hồ sơ đã thu thập.

+0

Cảm ơn Tom. Sẽ kiểm tra này ra nhưng cần vài ngày thời gian như Im tổ chức với một số thời hạn. Sẽ cập nhật cho bạn – rajesh

+0

Tôi có nên có 'WHERE u.RUNID = 2' trong truy vấn không? Không có kết quả nếu tôi có mệnh đề where where nhưng khi tôi gỡ bỏ nó và u.RUNID = d.RUNID, tôi nhận được lỗi IO 'ORA-01114: IO lỗi ghi khối vào tập tin (khối #)'. – rajesh

+0

Khi tôi cố gắng này 'chọn * từ all_source s LEFT JOIN plsql_profiler_units u ON s.OWNER = u.UNIT_OWNER VÀ s.NAME = u.UNIT_NAME VÀ s.TYPE = u.UNIT_TYPE LEFT JOIN plsql_profiler_data d ON u. UNIT_NUMBER = d.UNIT_NUMBER VÀ s.LINE = d.LINE # AND d.RUNID = u.RUNID trong đó total_occur không phải là null' Tôi nhận được kết quả. Tôi đã không null kiểm tra như tôi thấy một số mục như null nhưng với null kiểm tra tôi cũng nhận được 0. có thể là tôi cần phải> 0. Bất kỳ tối ưu hóa khác có thể? Tôi chỉ cần biết nếu một dòng đã được bảo hiểm hay không – rajesh

Các vấn đề liên quan