﻿<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Steven Feuerstein's Blog</title>
    <description>&lt;table cellspacing="1" cellpadding="1"&gt;
        &lt;tr&gt;
            &lt;td valign="top"&gt;&lt;img height="183" alt="" width="139" src="/Portals/0/Blog/blog-steven-feuerstein.png" /&gt;&lt;/td&gt;
            &lt;td valign="top"&gt;Steven Feuerstein is considered one of the world's leading experts on the Oracle PL/SQL language, having written ten books on PL/SQL (all published by O'Reilly Media, including Oracle PL/SQL Programming. Steven has been developing software since 1980, spent five years with Oracle (1987-1992) and has served as PL/SQL Evangelist for Quest Software since January 2001. He is also an Oracle ACE Director. He writes regularly for Oracle Magazine, which named him the PL/SQL Developer of the Year in both 2002 and 2006.
            &lt;p&gt;&amp;#160;Steven's blog provides advice and code that you can put to immediate use in your world of programming.&amp;#160;&lt;/p&gt;
            &lt;p&gt;&lt;font color="#003366" size="3"&gt;&lt;strong&gt;Recent postings on his  PL/SQL Obsession:&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
&lt;/table&gt;</description>
    <link>http://www.toadworld.com/BLOGS/tabid/67/BlogId/13/Default.aspx</link>
    <language>en-US</language>
    <managingEditor>Steven Feuerstein</managingEditor>
    <webMaster>webmaster@toadworld.com</webMaster>
    <pubDate>Fri, 19 Mar 2010 17:35:08 GMT</pubDate>
    <lastBuildDate>Fri, 19 Mar 2010 17:35:08 GMT</lastBuildDate>
    <docs>http://backend.userland.com/rss</docs>
    <generator>Blog RSS Generator Version 3.2.0.15477</generator>
    <item>
      <title>Analyzing code coverage with the PL/SQL profiler</title>
      <description>&lt;p&gt;I have, for the past several years, focused heavily on designing and building an automated code testing tool for PL/SQL: &lt;a href="http://www.toadworld.com/LinkClick.aspx?link=431&amp;tabid=67"&gt;Quest Code Tester for Oracle&lt;/a&gt;. One feature that is often requested as a part of code testing is analysis of code coverage, answering questions like:&lt;/p&gt;
&lt;ul type="disc"&gt;
    &lt;li&gt;When I run my program do I use 50% of the code? 75% of the code?  &lt;/li&gt;
    &lt;li&gt;Are there chunks of logic that are never run&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;The only way to get this kind of information is to turn on the PL/SQL profiler (and/or the new hierarchical profiler delivered with Oracle11g). The profiler keeps track of each line run by the program during the profile session. You then query the contents of the plsql_profiler_data|units|runs tables and draw your own conclusions.&lt;br /&gt;
 &lt;/div&gt;
&lt;div&gt;And therein lies the rub.&lt;br /&gt;
 &lt;/div&gt;
&lt;div&gt;Code Tester users don't want to see lengthy reports showing which lines where executed. Instead, they want us to provide them a single number that tells them all they need to know: "75% of my program was executed." Period.&lt;/div&gt;
&lt;div&gt;And I would like to provide that feature, I really would. But I am feeling a little bit stumped and thought I would share with you what I have done so far, and my areas of befuddlement, in hopes that you, my dear reader, may be able to help provide additional clarity.&lt;br /&gt;
 &lt;/div&gt;
&lt;div&gt;So what's the problem? Well....to figure out the % of code coverage, I need to....&lt;/div&gt;
&lt;ul&gt;
    &lt;li&gt;decide &lt;em&gt;which&lt;/em&gt; lines of code I should include in the &lt;em&gt;total&lt;/em&gt; number of possible lines that could be executed. For example: do I include comments? What about the IS, BEGIN, END keywords?&lt;/li&gt;
    &lt;li&gt;understand what lines of the code the profiler actually pays attention to, and records as having been run. I have never found the profiler data to be entirely straightforward.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And so I have decided to do some research and exploration. I created a package that contains lines of code with all sorts of line breaks to see if I could isolate how Oracle treats such code in the context of profiling.&lt;/p&gt;
&lt;p&gt;You will find below the code for this package, followed by a utility I wrote to show profiling data in a way that I thought would be useful, and then the output from a profiling session.&lt;/p&gt;
&lt;p&gt;Which leads to my questions for you:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Do you have any ideas on how I should go about computing this single, golden number regarding code coverage?&lt;/li&gt;
    &lt;li&gt;What lines do you think should be included or not?&lt;/li&gt;
    &lt;li&gt;Should I take a different approach in analyzing code and profiler behavior?&lt;/li&gt;
    &lt;li&gt;What do you think of the output I got from my "test" package?&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;Looking forward to your comments,&lt;br /&gt;
 &lt;/div&gt;
&lt;div&gt;Steven&lt;br /&gt;
 &lt;hr /&gt;
&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;&lt;font size="3"&gt;Package to exercise profiler&lt;/font&gt;&lt;/strong&gt;&lt;/div&gt;
&lt;pre&gt;CREATE OR REPLACE PACKAGE what_is_profiled&lt;br /&gt;IS&lt;br /&gt;   TYPE aa1 IS TABLE OF VARCHAR2 (100)&lt;br /&gt;      INDEX BY PLS_INTEGER;&lt;/pre&gt;
&lt;pre&gt;   TYPE aa2 IS TABLE OF VARCHAR2 (100)&lt;br /&gt;      INDEX BY PLS_INTEGER;&lt;/pre&gt;
&lt;pre&gt;   PROCEDURE proc1 (arg IN NUMBER, arg2 OUT VARCHAR2);&lt;/pre&gt;
&lt;pre&gt;   FUNCTION func1&lt;br /&gt;      RETURN VARCHAR2;&lt;br /&gt;      &lt;br /&gt;      procedure driver ;&lt;br /&gt;END what_is_profiled;&lt;br /&gt;/&lt;/pre&gt;
&lt;pre&gt;CREATE OR REPLACE PACKAGE BODY what_is_profiled&lt;br /&gt;IS&lt;br /&gt;   TYPE p_aa1 IS TABLE OF VARCHAR2 (100)&lt;br /&gt;      INDEX BY PLS_INTEGER;&lt;/pre&gt;
&lt;pre&gt;   TYPE p_aa2 IS TABLE OF VARCHAR2 (100)&lt;br /&gt;      INDEX BY PLS_INTEGER;&lt;/pre&gt;
&lt;pre&gt;   PROCEDURE loops (arg IN NUMBER, arg2 OUT VARCHAR2)&lt;br /&gt;   IS&lt;br /&gt;      val&lt;br /&gt;      INTEGER;&lt;br /&gt;      condition1 boolean := true;&lt;br /&gt;      condition2 boolean &lt;br /&gt;      := &lt;br /&gt;      true;&lt;br /&gt;      &lt;br /&gt;   BEGIN&lt;br /&gt;      FOR indx IN 1 .. 100&lt;br /&gt;      LOOP&lt;br /&gt;         NULL;&lt;br /&gt;      END LOOP;&lt;br /&gt;            &lt;br /&gt;      FOR &lt;br /&gt;      indx &lt;br /&gt;      IN &lt;br /&gt;      1 &lt;br /&gt;      .. &lt;br /&gt;      100&lt;br /&gt;      LOOP&lt;br /&gt;         val := 1;&lt;br /&gt;      END &lt;br /&gt;      LOOP; &lt;br /&gt;      &lt;br /&gt;      FOR indx IN 1 .. 100 LOOP NULL; END LOOP;     &lt;/pre&gt;
&lt;pre&gt;      FOR rec IN (SELECT *&lt;br /&gt;                    FROM all_source&lt;br /&gt;                   WHERE ROWNUM &lt; 101)&lt;br /&gt;      LOOP&lt;br /&gt;         val := 1;&lt;br /&gt;      END LOOP;&lt;/pre&gt;
&lt;pre&gt;      FOR &lt;br /&gt;      rec &lt;br /&gt;      IN &lt;br /&gt;      (&lt;br /&gt;      SELECT *&lt;br /&gt;                    FROM all_source&lt;br /&gt;                   WHERE ROWNUM &lt; 101&lt;br /&gt;      )&lt;br /&gt;      LOOP&lt;br /&gt;         val := 1;&lt;br /&gt;      END &lt;br /&gt;      LOOP;&lt;br /&gt;      &lt;br /&gt;      WHILE (condition1 AND condition2)&lt;br /&gt;      LOOP&lt;br /&gt;         condition1 := FALSE;&lt;br /&gt;      END LOOP;&lt;/pre&gt;
&lt;pre&gt;      WHILE &lt;br /&gt;      (&lt;br /&gt;      condition1 &lt;br /&gt;      AND &lt;br /&gt;      condition2&lt;br /&gt;      )&lt;br /&gt;      LOOP&lt;br /&gt;         condition1 &lt;br /&gt;         := &lt;br /&gt;         FALSE&lt;br /&gt;         ;&lt;br /&gt;      END LOOP;&lt;br /&gt;      &lt;br /&gt;      DECLARE&lt;br /&gt;         indx   INTEGER := 1;&lt;br /&gt;      BEGIN&lt;br /&gt;         LOOP&lt;br /&gt;            EXIT WHEN indx &gt; 100;&lt;br /&gt;            indx := indx + 1;&lt;br /&gt;         END LOOP;&lt;br /&gt;      END;&lt;br /&gt;      &lt;br /&gt;      DECLARE&lt;br /&gt;         indx   INTEGER := 1;&lt;br /&gt;      BEGIN&lt;br /&gt;         LOOP&lt;br /&gt;            EXIT &lt;br /&gt;            WHEN &lt;br /&gt;            indx &lt;br /&gt;            &gt; &lt;br /&gt;            100;&lt;br /&gt;            indx := indx + &lt;br /&gt;            1&lt;br /&gt;            ;&lt;br /&gt;         END LOOP;&lt;br /&gt;      END;      &lt;br /&gt;   END;&lt;/pre&gt;
&lt;pre&gt;   PROCEDURE conditionals &lt;br /&gt;   IS&lt;br /&gt;   a &lt;br /&gt;   boolean;&lt;br /&gt;   b boolean;&lt;br /&gt;   c boolean&lt;br /&gt;   ;&lt;br /&gt;   BEGIN&lt;br /&gt;      IF (a AND b OR c)&lt;br /&gt;      THEN&lt;br /&gt;         NULL;&lt;br /&gt;         elsif&lt;br /&gt;         a&lt;br /&gt;         then&lt;br /&gt;         null;&lt;br /&gt;         else&lt;br /&gt;         dbms_output.put_line ('a');&lt;br /&gt;      END IF;&lt;br /&gt;      &lt;br /&gt;      a := case&lt;br /&gt;      true&lt;br /&gt;      when true&lt;br /&gt;      then&lt;br /&gt;      false&lt;br /&gt;      when &lt;br /&gt;      false then&lt;br /&gt;      true&lt;br /&gt;      else&lt;br /&gt;      false&lt;br /&gt;      end&lt;br /&gt;      ;&lt;br /&gt;      a := case true&lt;br /&gt;      when true&lt;br /&gt;      then&lt;br /&gt;      false&lt;br /&gt;      when &lt;br /&gt;      false then&lt;br /&gt;      true&lt;br /&gt;      else&lt;br /&gt;      false&lt;br /&gt;      end&lt;br /&gt;      ;  &lt;br /&gt;      &lt;br /&gt;      case when &lt;br /&gt;      sysdate &gt; sysdate + 1&lt;br /&gt;      then&lt;br /&gt;      a := false;&lt;br /&gt;      when 1 &gt; 2 then&lt;br /&gt;      b := false;&lt;br /&gt;      when 1&lt;br /&gt;      &gt; 2   &lt;br /&gt;      then&lt;br /&gt;      c := false;&lt;br /&gt;      else null; end case; &lt;br /&gt;   END;&lt;/pre&gt;
&lt;pre&gt;   FUNCTION p_func1&lt;br /&gt;      RETURN VARCHAR2&lt;br /&gt;   IS&lt;br /&gt;   BEGIN&lt;br /&gt;      RETURN NULL;&lt;br /&gt;   END;&lt;/pre&gt;
&lt;pre&gt;   PROCEDURE proc1 (arg IN NUMBER, arg2 OUT VARCHAR2)&lt;br /&gt;   IS&lt;br /&gt;   BEGIN&lt;br /&gt;      NULL;&lt;br /&gt;   END;&lt;/pre&gt;
&lt;pre&gt;   FUNCTION func1&lt;br /&gt;      RETURN VARCHAR2&lt;br /&gt;   IS&lt;br /&gt;   BEGIN&lt;br /&gt;      RETURN p_func1;&lt;br /&gt;   END;&lt;br /&gt;   &lt;br /&gt;   procedure driver is&lt;br /&gt;   l varchar2(100);&lt;br /&gt;   begin&lt;br /&gt;   loops(1, l);&lt;br /&gt;   conditionals;&lt;br /&gt;   proc1&lt;br /&gt;   (&lt;br /&gt;   1&lt;br /&gt;   ,&lt;br /&gt;   l);&lt;br /&gt;   GOTO checkloop;&lt;br /&gt;   &lt;&lt;checkloop&gt;&lt;/checkloop&gt;&gt;&lt;br /&gt;   dbms_output.put_line ('a');&lt;br /&gt;   end;&lt;br /&gt;END what_is_profiled;&lt;br /&gt;/&lt;/pre&gt;
&lt;pre&gt;&lt;hr /&gt;&lt;/pre&gt;
&lt;div&gt;&lt;strong&gt;&lt;font size="4"&gt;&lt;font size="3"&gt;Utility to show profiler data&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/div&gt;
&lt;pre&gt;CREATE OR REPLACE PROCEDURE show_lines_profiled&lt;br /&gt;/*&lt;br /&gt;Assumptions: the ONLY data inside the profiler tables are for a single&lt;br /&gt;run of what_is_profiled.driver&lt;br /&gt;*/&lt;br /&gt;IS&lt;br /&gt;   l_type varchar2( 10000 );&lt;br /&gt;BEGIN&lt;br /&gt;   DBMS_OUTPUT.put_line( 'Profiling Report' );&lt;br /&gt;   DBMS_OUTPUT.put_line( '  NOT PROFILED = No profile data for this line' );&lt;br /&gt;   DBMS_OUTPUT.put_line( '  ZERO RUNS    = Profiled, but TOTAL_OCCURS = 0' );&lt;br /&gt;   DBMS_OUTPUT.put_line( '  LINE RUN     = This line was executed at least once' );&lt;/pre&gt;
&lt;pre&gt;   DBMS_OUTPUT.put_line( 'Profile Info   Line Source');&lt;br /&gt;   DBMS_OUTPUT.put_line( &lt;br /&gt;'============== ==== ==============================================================');&lt;/pre&gt;
&lt;pre&gt;   FOR rec&lt;br /&gt;   IN (  SELECT line, text&lt;br /&gt;           FROM all_source als&lt;br /&gt;          WHERE     als.owner = USER&lt;br /&gt;                AND als.name = 'WHAT_IS_PROFILED'&lt;br /&gt;                AND als.TYPE = 'PACKAGE BODY'&lt;br /&gt;       ORDER BY line )&lt;br /&gt;   LOOP&lt;br /&gt;      BEGIN&lt;br /&gt;         SELECT CASE&lt;br /&gt;                   WHEN total_occur = 0 THEN 'ZERO RUNS'&lt;br /&gt;                   ELSE 'LINE RUN'&lt;br /&gt;                END&lt;br /&gt;                   profile_type&lt;br /&gt;           INTO l_type&lt;br /&gt;           FROM plsql_profiler_data ppd&lt;br /&gt;          WHERE ppd.line# = rec.line AND ppd.unit_number = 2;&lt;br /&gt;      EXCEPTION&lt;br /&gt;         WHEN NO_DATA_FOUND&lt;br /&gt;         THEN&lt;br /&gt;            l_type      := 'NOT PROFILED';&lt;br /&gt;      END;&lt;/pre&gt;
&lt;pre&gt; &lt;/pre&gt;
&lt;pre&gt;      DBMS_OUTPUT.put_line(   RPAD( l_type, 15 )&lt;br /&gt;                           || LPAD( rec.line, 4 )&lt;br /&gt;                           || ' '&lt;br /&gt;                           || rtrim (rec.text, chr(10)));&lt;br /&gt;   END LOOP;&lt;br /&gt;END show_lines_profiled;&lt;/pre&gt;
&lt;pre&gt;&lt;hr /&gt;&lt;/pre&gt;
&lt;div&gt;&lt;strong&gt;&lt;font size="4"&gt;&lt;font size="3"&gt;Results of profiling the package&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/div&gt;
&lt;pre&gt;BEGIN&lt;br /&gt;   DELETE FROM plsql_profiler_data;&lt;/pre&gt;
&lt;pre&gt;   DELETE FROM plsql_profiler_units;&lt;/pre&gt;
&lt;pre&gt;   DELETE FROM plsql_profiler_runs;&lt;/pre&gt;
&lt;pre&gt;   DBMS_OUTPUT.put_line(&lt;br /&gt;                         DBMS_PROFILER.start_profiler( 'What is profiled?' )&lt;br /&gt;   );&lt;br /&gt;   what_is_profiled.driver( );&lt;br /&gt;   DBMS_PROFILER.stop_profiler;&lt;br /&gt;   --&lt;br /&gt;   show_lines_profiled();&lt;br /&gt;END;&lt;br /&gt;/&lt;br /&gt;Profiling Report&lt;br /&gt;  NOT PROFILED = No profile data for this line&lt;br /&gt;  ZERO RUNS    = Profiled, but TOTAL_OCCURS = 0&lt;br /&gt;  LINE RUN     = This line was executed at least once&lt;br /&gt;Profile Info   Line Source&lt;br /&gt;============== ==== ==============================================================&lt;br /&gt;NOT PROFILED      1 PACKAGE BODY what_is_profiled&lt;br /&gt;NOT PROFILED      2 IS&lt;br /&gt;NOT PROFILED      3    TYPE p_aa1 IS TABLE OF VARCHAR2 (100)&lt;br /&gt;NOT PROFILED      4       INDEX BY PLS_INTEGER;&lt;br /&gt;NOT PROFILED      5 &lt;br /&gt;NOT PROFILED      6    TYPE p_aa2 IS TABLE OF VARCHAR2 (100)&lt;br /&gt;NOT PROFILED      7       INDEX BY PLS_INTEGER;&lt;br /&gt;NOT PROFILED      8 &lt;br /&gt;ZERO RUNS         9    PROCEDURE loops (arg IN NUMBER, arg2 OUT VARCHAR2)&lt;br /&gt;NOT PROFILED     10    IS&lt;br /&gt;NOT PROFILED     11       val&lt;br /&gt;NOT PROFILED     12       INTEGER;&lt;br /&gt;LINE RUN         13       condition1 boolean := true;&lt;br /&gt;LINE RUN         14       condition2 boolean &lt;br /&gt;NOT PROFILED     15       := &lt;br /&gt;NOT PROFILED     16       true;&lt;br /&gt;NOT PROFILED     17       &lt;br /&gt;NOT PROFILED     18    BEGIN&lt;br /&gt;LINE RUN         19       FOR indx IN 1 .. 100&lt;br /&gt;NOT PROFILED     20       LOOP&lt;br /&gt;LINE RUN         21          NULL;&lt;br /&gt;NOT PROFILED     22       END LOOP;&lt;br /&gt;NOT PROFILED     23             &lt;br /&gt;LINE RUN         24       FOR &lt;br /&gt;NOT PROFILED     25       indx &lt;br /&gt;NOT PROFILED     26       IN &lt;br /&gt;NOT PROFILED     27       1 &lt;br /&gt;NOT PROFILED     28       .. &lt;br /&gt;NOT PROFILED     29       100&lt;br /&gt;NOT PROFILED     30       LOOP&lt;br /&gt;LINE RUN         31          val := 1;&lt;br /&gt;NOT PROFILED     32       END &lt;br /&gt;NOT PROFILED     33       LOOP; &lt;br /&gt;NOT PROFILED     34       &lt;br /&gt;LINE RUN         35       FOR indx IN 1 .. 100 LOOP NULL; END LOOP;      &lt;br /&gt;NOT PROFILED     36 &lt;br /&gt;LINE RUN         37       FOR rec IN (SELECT *&lt;br /&gt;NOT PROFILED     38                     FROM all_source&lt;br /&gt;NOT PROFILED     39                    WHERE ROWNUM &lt; 101)&lt;br /&gt;NOT PROFILED     40       LOOP&lt;br /&gt;LINE RUN         41          val := 1;&lt;br /&gt;NOT PROFILED     42       END LOOP;&lt;br /&gt;NOT PROFILED     43 &lt;br /&gt;LINE RUN         44       FOR &lt;br /&gt;NOT PROFILED     45       rec &lt;br /&gt;NOT PROFILED     46       IN &lt;br /&gt;NOT PROFILED     47       (&lt;br /&gt;ZERO RUNS        48       SELECT *&lt;br /&gt;NOT PROFILED     49                     FROM all_source&lt;br /&gt;NOT PROFILED     50                    WHERE ROWNUM &lt; 101&lt;br /&gt;NOT PROFILED     51       )&lt;br /&gt;NOT PROFILED     52       LOOP&lt;br /&gt;LINE RUN         53          val := 1;&lt;br /&gt;NOT PROFILED     54       END &lt;br /&gt;NOT PROFILED     55       LOOP;&lt;br /&gt;NOT PROFILED     56       &lt;br /&gt;LINE RUN         57       WHILE (condition1 AND condition2)&lt;br /&gt;NOT PROFILED     58       LOOP&lt;br /&gt;NOT PROFILED     59          condition1 := FALSE;&lt;br /&gt;NOT PROFILED     60       END LOOP;&lt;br /&gt;NOT PROFILED     61 &lt;br /&gt;NOT PROFILED     62       WHILE &lt;br /&gt;NOT PROFILED     63       (&lt;br /&gt;NOT PROFILED     64       condition1 &lt;br /&gt;NOT PROFILED     65       AND &lt;br /&gt;NOT PROFILED     66       condition2&lt;br /&gt;NOT PROFILED     67       )&lt;br /&gt;NOT PROFILED     68       LOOP&lt;br /&gt;NOT PROFILED     69          condition1 &lt;br /&gt;NOT PROFILED     70          := &lt;br /&gt;NOT PROFILED     71          FALSE&lt;br /&gt;NOT PROFILED     72          ;&lt;br /&gt;NOT PROFILED     73       END LOOP;&lt;br /&gt;NOT PROFILED     74       &lt;br /&gt;NOT PROFILED     75       DECLARE&lt;br /&gt;LINE RUN         76          indx   INTEGER := 1;&lt;br /&gt;NOT PROFILED     77       BEGIN&lt;br /&gt;LINE RUN         78          LOOP&lt;br /&gt;LINE RUN         79             EXIT WHEN indx &gt; 100;&lt;br /&gt;LINE RUN         80             indx := indx + 1;&lt;br /&gt;NOT PROFILED     81          END LOOP;&lt;br /&gt;NOT PROFILED     82       END;&lt;br /&gt;NOT PROFILED     83       &lt;br /&gt;NOT PROFILED     84       DECLARE&lt;br /&gt;LINE RUN         85          indx   INTEGER := 1;&lt;br /&gt;NOT PROFILED     86       BEGIN&lt;br /&gt;LINE RUN         87          LOOP&lt;br /&gt;LINE RUN         88             EXIT &lt;br /&gt;NOT PROFILED     89             WHEN &lt;br /&gt;NOT PROFILED     90             indx &lt;br /&gt;NOT PROFILED     91             &gt; &lt;br /&gt;NOT PROFILED     92             100;&lt;br /&gt;LINE RUN         93             indx := indx + &lt;br /&gt;NOT PROFILED     94             1&lt;br /&gt;NOT PROFILED     95             ;&lt;br /&gt;NOT PROFILED     96          END LOOP;&lt;br /&gt;NOT PROFILED     97       END;      &lt;br /&gt;LINE RUN         98    END;&lt;br /&gt;NOT PROFILED     99 &lt;br /&gt;ZERO RUNS       100    PROCEDURE conditionals &lt;br /&gt;NOT PROFILED    101    IS&lt;br /&gt;NOT PROFILED    102    a &lt;br /&gt;NOT PROFILED    103    boolean;&lt;br /&gt;NOT PROFILED    104    b boolean;&lt;br /&gt;NOT PROFILED    105    c boolean&lt;br /&gt;NOT PROFILED    106    ;&lt;br /&gt;NOT PROFILED    107    BEGIN&lt;br /&gt;LINE RUN        108       IF (a AND b OR c)&lt;br /&gt;NOT PROFILED    109       THEN&lt;br /&gt;NOT PROFILED    110          NULL;&lt;br /&gt;NOT PROFILED    111          elsif&lt;br /&gt;LINE RUN        112          a&lt;br /&gt;NOT PROFILED    113          then&lt;br /&gt;NOT PROFILED    114          null;&lt;br /&gt;NOT PROFILED    115          else&lt;br /&gt;LINE RUN        116          dbms_output.put_line ('a');&lt;br /&gt;NOT PROFILED    117       END IF;&lt;br /&gt;NOT PROFILED    118       &lt;br /&gt;LINE RUN        119       a := case&lt;br /&gt;NOT PROFILED    120       true&lt;br /&gt;NOT PROFILED    121       when true&lt;br /&gt;NOT PROFILED    122       then&lt;br /&gt;NOT PROFILED    123       false&lt;br /&gt;NOT PROFILED    124       when &lt;br /&gt;NOT PROFILED    125       false then&lt;br /&gt;NOT PROFILED    126       true&lt;br /&gt;NOT PROFILED    127       else&lt;br /&gt;NOT PROFILED    128       false&lt;br /&gt;NOT PROFILED    129       end&lt;br /&gt;NOT PROFILED    130       ;&lt;br /&gt;LINE RUN        131       a := case true&lt;br /&gt;NOT PROFILED    132       when true&lt;br /&gt;NOT PROFILED    133       then&lt;br /&gt;NOT PROFILED    134       false&lt;br /&gt;NOT PROFILED    135       when &lt;br /&gt;NOT PROFILED    136       false then&lt;br /&gt;NOT PROFILED    137       true&lt;br /&gt;NOT PROFILED    138       else&lt;br /&gt;NOT PROFILED    139       false&lt;br /&gt;NOT PROFILED    140       end&lt;br /&gt;NOT PROFILED    141       ;  &lt;br /&gt;NOT PROFILED    142       &lt;br /&gt;LINE RUN        143       case when &lt;br /&gt;NOT PROFILED    144       sysdate &gt; sysdate + 1&lt;br /&gt;NOT PROFILED    145       then&lt;br /&gt;LINE RUN        146       a := false;&lt;br /&gt;NOT PROFILED    147       when 1 &gt; 2 then&lt;br /&gt;NOT PROFILED    148       b := false;&lt;br /&gt;NOT PROFILED    149       when 1&lt;br /&gt;NOT PROFILED    150       &gt; 2   &lt;br /&gt;NOT PROFILED    151       then&lt;br /&gt;NOT PROFILED    152       c := false;&lt;br /&gt;NOT PROFILED    153       else null; end case; &lt;br /&gt;NOT PROFILED    154    END;&lt;br /&gt;NOT PROFILED    155 &lt;br /&gt;ZERO RUNS       156    FUNCTION p_func1&lt;br /&gt;NOT PROFILED    157       RETURN VARCHAR2&lt;br /&gt;NOT PROFILED    158    IS&lt;br /&gt;NOT PROFILED    159    BEGIN&lt;br /&gt;ZERO RUNS       160       RETURN NULL;&lt;br /&gt;ZERO RUNS       161    END;&lt;br /&gt;NOT PROFILED    162 &lt;br /&gt;ZERO RUNS       163    PROCEDURE proc1 (arg IN NUMBER, arg2 OUT VARCHAR2)&lt;br /&gt;NOT PROFILED    164    IS&lt;br /&gt;NOT PROFILED    165    BEGIN&lt;br /&gt;LINE RUN        166       NULL;&lt;br /&gt;NOT PROFILED    167    END;&lt;br /&gt;NOT PROFILED    168 &lt;br /&gt;ZERO RUNS       169    FUNCTION func1&lt;br /&gt;NOT PROFILED    170       RETURN VARCHAR2&lt;br /&gt;NOT PROFILED    171    IS&lt;br /&gt;NOT PROFILED    172    BEGIN&lt;br /&gt;ZERO RUNS       173       RETURN p_func1;&lt;br /&gt;ZERO RUNS       174    END;&lt;br /&gt;NOT PROFILED    175    &lt;br /&gt;ZERO RUNS       176    procedure driver is&lt;br /&gt;NOT PROFILED    177    l varchar2(100);&lt;br /&gt;NOT PROFILED    178    begin&lt;br /&gt;LINE RUN        179    loops(1, l);&lt;br /&gt;LINE RUN        180    conditionals;&lt;br /&gt;LINE RUN        181    proc1&lt;br /&gt;NOT PROFILED    182    (&lt;br /&gt;NOT PROFILED    183    1&lt;br /&gt;NOT PROFILED    184    ,&lt;br /&gt;NOT PROFILED    185    l);&lt;br /&gt;LINE RUN        186    GOTO checkloop;&lt;br /&gt;NOT PROFILED    187    &lt;&lt;checkloop&gt;&lt;/checkloop&gt;&gt;&lt;br /&gt;LINE RUN        188    dbms_output.put_line ('a');&lt;br /&gt;LINE RUN        189    end;&lt;br /&gt;NOT PROFILED    190 END what_is_profiled;&lt;/pre&gt;</description>
      <link>http://www.toadworld.com/BLOGS/tabid/67/EntryID/267/Default.aspx</link>
      <author>Steven Feuerstein</author>
      <comments>http://www.toadworld.com/BLOGS/tabid/67/EntryID/267/Default.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.toadworld.com/Default.aspx?tabid=67&amp;EntryID=267</guid>
      <pubDate>Wed, 27 Aug 2008 22:55:00 GMT</pubDate>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.toadworld.com/DesktopModules/Blog/Trackback.aspx?id=267</trackback:ping>
    </item>
  </channel>
</rss>