<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8677649049588007585</id><updated>2012-01-28T18:23:49.706Z</updated><title type='text'>PL/SQL Challenge</title><subtitle type='html'>The PL/SQL Challenge (www.plsqlchallenge.com) offers a daily quiz on the PL/SQL language, through which thousands of Oracle technologists demonstrate and deepen their knowledge of PL/SQL. This blog contains posts by the PL/SQL Challenge founder, Steven Feuerstein, as well as comments from players.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default?start-index=101&amp;max-results=100'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>309</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-617810720934243647</id><published>2012-01-27T14:21:00.000Z</published><updated>2012-01-27T14:21:21.139Z</updated><title type='text'>Compiling Incomplete Program Units (9633)</title><content type='html'>The 25 January quiz tested your knowledge of the minimal amount of code needed to "create" a PL/SQL procedure in the data dictionary, even if the resulting program unit is invalid.&lt;br /&gt;
&lt;br /&gt;
The choices offered were:&lt;br /&gt;
&lt;br /&gt;
CREATE PROCEDURE plch_test;&lt;br /&gt;
CREATE PROCEDURE plch_test AS;&lt;br /&gt;
CREATE PROCEDURE plch_test NULL;&lt;br /&gt;
CREATE PROCEDURE plch_test IS BEGIN NULL; END;&lt;br /&gt;
&lt;br /&gt;
The first was scored as incorrect and the last three as correct.&lt;br /&gt;
&lt;br /&gt;
Several players demonstrated ways to execute these statements in either Toad or SQL Developer that either (a) caused the first statement to create an object (invalid procedure) or (b) caused the third statement to &lt;i&gt;not&lt;/i&gt; create an object in the database.&lt;br /&gt;
&lt;br /&gt;
The author of this quiz, Jeff Kemp, did some research and found the following:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;SQL*Plus: no problem - the first statement does not create any object, the  latter 3 statements do create an object.&lt;/div&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;div style="color: blue;"&gt;TOAD - I get varying results for option 3, depending on how&amp;nbsp;I invoke the  statement in the SQL editor.&lt;/div&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;div style="color: blue;"&gt;Quiz Option 1: CREATE PROCEDURE PLCH_TEST;&lt;/div&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;div style="color: blue;"&gt;1. Highlight statement, press F5&lt;/div&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;div style="color: blue;"&gt;&amp;nbsp; Result: "ORA-00911: invalid character" - no object created&lt;/div&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;div style="color: blue;"&gt;2. Highlight statement, press F9&lt;/div&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;div style="color: blue;"&gt;&amp;nbsp; Result: "[Error] Syntax check (5: 27): Found: &amp;nbsp;';' Expecting: AS &amp;nbsp;IS &amp;nbsp;  -or- &amp;nbsp; ......" - no object created&lt;/div&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;div style="color: blue;"&gt;3. Highlight statement, press Ctrl+Enter&lt;/div&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;div style="color: blue;"&gt; &lt;div&gt;&amp;nbsp; Result: "[Error] Syntax check (5: 27): Found: &amp;nbsp;';' Expecting: AS &amp;nbsp;IS &amp;nbsp;  -or- &amp;nbsp; ......" - no object created&lt;/div&gt;&lt;/div&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;div style="color: blue;"&gt; &lt;div&gt;&lt;br class="Apple-interchange-newline" /&gt;&lt;/div&gt;&lt;/div&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;div style="color: blue;"&gt;So I haven't been able to create an object using the first quiz option at  all. By the way, each of the above tests were repeated after highlighting just  the statement by itself, as well as highlighting the statement plus the  following slash (/).&lt;/div&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;div style="color: blue;"&gt;Quiz Option 3: CREATE PROCEDURE PLCH_TEST NULL;&lt;/div&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;div style="color: blue;"&gt; &lt;div&gt;1. Highlight statement,&amp;nbsp;press F5&lt;/div&gt;&lt;div&gt;&amp;nbsp; Result: object created with compilation error&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;2. Highlight statement, press F9&lt;/div&gt;&lt;div&gt;&amp;nbsp; Result: "[Error] Syntax check (5: 27): Found: &amp;nbsp;';' Expecting: AS &amp;nbsp;IS &amp;nbsp;  -or- &amp;nbsp; ..." - no object created&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;3. Highlight statement, press Ctrl+Enter&lt;/div&gt;&lt;div&gt; &lt;div&gt;&amp;nbsp; Result: "[Error] Syntax check (5: 27): Found: &amp;nbsp;';' Expecting: AS &amp;nbsp;IS &amp;nbsp;  -or- &amp;nbsp; ..." - no object created&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Looks like if you use the F5 option, the third CREATE PROCEDURE quiz option  does work in Toad.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;I, on the other hand, was able to get the first choice to create an object by pressing the green arrow button in the Editor menu in Toad. Go figure.&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;The assumptions for the PL/SQL quizzes state that you can use your choice of IDE (SQL*Plus, Toad, SQL Developer, etc.). For this quiz, that turned out to be a very tricky assumption, because the IDEs offer multiple ways to execute statements that handle the terminating character of the statements differently.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;For some, the semi-colon is treated as part of the code. In others, it is treated as the terminator of the statement, to trigger execution.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;As a result, I will be giving everyone credit for the 1st and 3rd choices. In addition, I have changed the question to specify that these statements execute in SQL*Plus &lt;i&gt;and&lt;/i&gt; I have explicitly included the "/" to execute the buffer.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-617810720934243647?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/617810720934243647/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2012/01/compiling-incomplete-program-units-9633.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/617810720934243647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/617810720934243647'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2012/01/compiling-incomplete-program-units-9633.html' title='Compiling Incomplete Program Units (9633)'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-1692607932747896477</id><published>2012-01-23T19:19:00.000Z</published><updated>2012-01-23T19:19:49.443Z</updated><title type='text'>Q4 2011 Championship Playoff on 25 January</title><content type='html'>The 7th quarterly championship playoff of the &lt;a href="http://www.plsqlchallenge.com/" target="_blank"&gt;PL/SQL Challenge&lt;/a&gt; will take place on Wednesday, 25 January.&lt;br /&gt;
&lt;br /&gt;
Forty-two players qualified to &lt;a href="http://plsql-challenge.blogspot.com/2012/01/hapy-new-year-and-participants-in-q4.html" target="_blank"&gt;participate&lt;/a&gt;. In this playoff, players will have 30 minutes in which to take five quizzes. Scoring and ranking for the playoff follows the same formula used for the daily quiz.&lt;br /&gt;
&lt;br /&gt;
While everyone cannot win, I wish all players the best as they demonstrate their expertise in the Oracle PL/SQL language!&lt;br /&gt;
&lt;br /&gt;
Steven Feuerstein&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-1692607932747896477?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/1692607932747896477/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2012/01/q4-2011-championship-playoff-on-25.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/1692607932747896477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/1692607932747896477'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2012/01/q4-2011-championship-playoff-on-25.html' title='Q4 2011 Championship Playoff on 25 January'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-3416851232266012896</id><published>2012-01-19T15:51:00.001Z</published><updated>2012-01-19T16:04:05.239Z</updated><title type='text'>Exploring DBMS_UTILITY.FORMAT_CALL_STACK (9628)</title><content type='html'>The 18 January quiz tested your knowledge of the contents of strings returned by a call to DBMS_UTILITY.FORMAT_CALL_STACK, which (roughly speaking) answers the question: "How did I get here?" (with a nod to the &lt;a href="http://www.lyricsfreak.com/t/talking+heads/once+in+a+lifetime_20135070.html"&gt;Talking Heads&lt;/a&gt;, one of my all-time favorite bands)&lt;br /&gt;
&lt;br /&gt;
Iudith Mentzel went exploring and came up with some interesting tidbits that I thought I would share.&lt;br /&gt;
&lt;br /&gt;
First, she noted that &lt;span style="color: blue;"&gt;"this quiz was very similar with the quiz from 21 April 2011.  The only difference was that it mentioned a nested block for the procedure that is calling DBMS_UTILITY.FORMAT_CALL_STACK...by the way, in comparison with the previous one that was scored as Advanced, this one was even trickier and scored as Intermediate, which looks not very consistent."&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
You are absolutely right, Iudith. That was not very consistent. Among other things, once a reviewer pointed out that the bottom of the stack could under some circumstances not be an anonymous block, I should have changed it to Advanced.&lt;br /&gt;
&lt;br /&gt;
With my spare moments, I am going back to older quizzes and cleaning them up (adding lesson summaries and verification code, for example, since these were not even stored with questions when the PL/SQL Challenge first started). In the process I am finding many quizzes whose levels of difficulty and other information should probably be adjusted. These changes would, however, also affect scoring. So at some point, we will tweak our backend so that "old" scores and ranking data are archived and will not be affected by changes in the questions.&lt;br /&gt;
&lt;br /&gt;
Now on to more substantive thoughts from Iudith on the call stack function (her words in &lt;span style="color: blue;"&gt;blue&lt;/span&gt;):&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;Checking the quiz scenario, I found some strange issues, here is my test case:&lt;/div&gt;&lt;pre style="color: blue;"&gt;CREATE OR REPLACE PROCEDURE plch_proc1
IS
BEGIN
   BEGIN
       DBMS_OUTPUT.put_line (DBMS_UTILITY.format_call_stack);
   END;   
END;
/

-- Procedure created.

CREATE OR REPLACE PACKAGE plch_pkg1
IS
   PROCEDURE proc2;
END plch_pkg1;
/

-- Package created.

CREATE OR REPLACE PACKAGE BODY plch_pkg1
IS
   PROCEDURE proc2
   IS
   BEGIN
      plch_proc1;
   END;
END plch_pkg1;
/

-- Package body created.

CREATE OR REPLACE PROCEDURE plch_proc3
IS
BEGIN
   plch_pkg1.proc2;
END;
/

-- Procedure created.

-- testing
BEGIN
    plch_proc3;
END;
/

----- PL/SQL Call Stack -----
  object      line  object
  handle    number  name
000007FFD219EC48         5  procedure SCOTT.PLCH_PROC1
000007FFD1FF5810         6  package body SCOTT.PLCH_PKG1
000007FFD1F54060         4  procedure SCOTT.PLCH_PROC3
000007
&lt;/pre&gt;&lt;div style="color: blue;"&gt;For some reason, SQL*PLUS client (version 9i) did not display the output correctly; the "anonymous block" is NOT there ... though it should be.The above output looks like this after some editing, otherwise the lines were broken in the middle ...This was tested with an 11gR1 database (11.1.0.7.0) having UTF8 character set. The same SQL*PLUS client version, on a single-byte character set database was even stranger:&lt;/div&gt;&lt;pre style="color: blue;"&gt;BEGIN
plch_proc3;
END;
/

ERROR:
ORA-06502: PL/SQL: numeric or value error: host bind array too small
ORA-06512: at line 1
&lt;/pre&gt;&lt;div style="color: blue;"&gt;Just "to make peace", I decided to put the value into a table and select  afterwards to see it, so I rewrote plch_proc1 ... and now comes the interesting part:&lt;/div&gt;&lt;pre style="color: blue;"&gt;CREATE TABLE plch_temp ( x VARCHAR2(4000) )
/

-- Table created.

--version 1 - insert the  function result directly into the table:

CREATE OR REPLACE PROCEDURE plch_proc1
IS
BEGIN
BEGIN
   INSERT INTO plch_temp VALUES (DBMS_UTILITY.format_call_stack);
END;   
END;
/

-- Procedure created.

BEGIN
plch_proc3;
END;
/

-- PL/SQL procedure successfully completed.

-- now we have "anonymous block" TWICE  !!!
SQL&amp;gt; SELECT * FROM plch_temp
2  /

----- PL/SQL Call Stack -----
object      line  object
handle    number  name
000007FFD1EE0C38         1  anonymous block
000007FFD219EC48         7  procedure SCOTT.PLCH_PROC1
000007FFD1FF5810         6  package body SCOTT.PLCH_PKG1
000007FFD1F54060         4  procedure SCOTT.PLCH_PROC3
000007FFD1E3EEB8         2  anonymous block

1 row selected.

ROLLBACK;
/

--version 2 - store the function result in a local variable before inserting:

CREATE OR REPLACE PROCEDURE plch_proc1
IS
x   VARCHAR2(4000);
BEGIN
BEGIN
-- DBMS_OUTPUT.put_line (DBMS_UTILITY.format_call_stack);      
-- INSERT INTO plch_temp VALUES (DBMS_UTILITY.format_call_stack);
   x := DBMS_UTILITY.format_call_stack;
   INSERT INTO plch_temp VALUES (x);
END;   
END;
/

-- Procedure created.

BEGIN
plch_proc3;
END;
/

-- PL/SQL procedure successfully completed.

-- now it is finally as expected 
SQL&amp;gt; SELECT * FROM plch_temp
2  /

----- PL/SQL Call Stack -----
object      line  object
handle    number  name
000007FFD219EC48        10  procedure SCOTT.PLCH_PROC1
000007FFD1FF5810         6  package body SCOTT.PLCH_PKG1
000007FFD1F54060         4  procedure SCOTT.PLCH_PROC3
000007FFD1F3F920         2  anonymous block

1 row selected.
&lt;/pre&gt;&lt;div style="color: blue;"&gt;Just as a last remark, the command line SQLPLUS.exe of Oracle client version 11g displayed the output almost correctly with the original DBMS_OUTPUT.put_line, that is, "anonymous block" was displayed once, but with the lines still broken in the middle ...&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="color: blue;"&gt;But the above tests that insert into a table look however strange ...it would be interesting to hear if anybody does have any clue for this behavior .&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="color: blue;"&gt;Looks like calling the function DIRECTLY from a SQL statement does generate an additional "anonymous block" layer in the call stack ... which can even become misleading if one seriously considers using this function not just for "PL/SQL fun" ...&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="color: blue;"&gt;I know that you are very "fond of" the DBMS_UTILITY.FORMAT_CALL_STACK function, however, I don't think that using it "as is" is such a "big gift" made to the developers ... Maybe only by hiding it into another "text analyzing" package, like the sample one supplied .&lt;/div&gt;&lt;br /&gt;
Back to Steven....it is unlikely that very many of you are still running an Oracle9i client, so that is probably not much of an issue, though interesting to discover. Also good to know that calling the call stack function from within an SQL statement, &lt;i&gt;inside&lt;/i&gt; PL/SQL, introduces another anonymous block to the stack. It makes sense to me that this "internal" anonymous block would disappear in that last example. The function is not being called from within the SQL statement any longer.&lt;br /&gt;
&lt;br /&gt;
Thanks, once again, to Iudith for her fascinating explorations. Any comments from other players?&lt;br /&gt;
&lt;br /&gt;
Cheers, SF&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-3416851232266012896?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/3416851232266012896/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2012/01/exploring-dbmsutilityformatcallstack.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/3416851232266012896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/3416851232266012896'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2012/01/exploring-dbmsutilityformatcallstack.html' title='Exploring DBMS_UTILITY.FORMAT_CALL_STACK (9628)'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-4444559602053466013</id><published>2012-01-11T18:12:00.003Z</published><updated>2012-01-11T18:19:16.314Z</updated><title type='text'>Serializable Transaction Impact Not Seen by Players (9622)</title><content type='html'>The 10 January quiz tested your knowledge of serializable transactions and system change numbers. Several players ran the verification code and got "b = 0" for the second and fourth choices (9005 and 9007), which would have made them correct (they were marked as incorrect). Here's the report from one player:&lt;br /&gt;
&lt;br /&gt;
I checked your verification code for the yesterday challenge about isolation level. On my database (Ora 10.2.0.4-64) the choices 9005 and 9007 are working fine and the output is "b = 0". If you run the verification code without the choices 9004 and 9006 it runs without error. Here is my testcase:&lt;br /&gt;
&lt;pre style="color: blue;"&gt;SQL*Plus: Release 10.2.0.4.0 - Production on Wed Jan 11 16:03:28 2012
Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL&amp;gt; create table plch_test (a number, b number);
Table created.

SQL&amp;gt; begin
  insert into plch_test values (1, 0);
  insert into plch_test values (2, 0);
  commit;
end;
/ 

PL/SQL procedure successfully completed.

SQL&amp;gt; declare
  b number;
  2    3    procedure xxx
  4    is
  5      pragma autonomous_transaction;
  6    begin
  7      set transaction isolation level read committed;
  8       update plch_test
  9          set b = 1
 10        where a = 2;
 11        commit;
 12        select ORA_ROWSCN into b from plch_test
 13        where a = 1;
 14        dbms_output.put_line('ORA_ROWSCN_XXX = '||b);
 15    end;
 16  begin
 17    select ORA_ROWSCN into b from plch_test
 18    where a = 1;
 19    dbms_output.put_line('ORA_ROWSCN_start = '||b);
 20    set transaction isolation level serializable;
 21    dbms_lock.sleep(10);
 22    xxx;
 23    select ORA_ROWSCN into b from plch_test
 24    where a = 1 for update;
 25    dbms_output.put_line('ORA_ROWSCN_end = '||b);
 26  exception
 27    when others then
 28      dbms_output.put_line('Error');
 29  end;
 30  /
ORA_ROWSCN_start = 855358236
ORA_ROWSCN_XXX = 855358246
ORA_ROWSCN_end = 855358236
&lt;/pre&gt;&lt;div style="color: blue;"&gt;As you see, the SCN of the autonomous transaction is higher than the SCN from the select for update at the end. What is your explanation of this?&lt;/div&gt;&lt;br /&gt;
I have asked, _Nikotin, the author of the quiz to do some research and post his reply here.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-4444559602053466013?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/4444559602053466013/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2012/01/rowdependencies-impact-not-seen-by.html#comment-form' title='19 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/4444559602053466013'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/4444559602053466013'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2012/01/rowdependencies-impact-not-seen-by.html' title='Serializable Transaction Impact Not Seen by Players (9622)'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>19</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-2708240558598558603</id><published>2012-01-10T21:54:00.000Z</published><updated>2012-01-10T21:54:00.314Z</updated><title type='text'>Exploring Mutating Table Errors and FORALL (9619)</title><content type='html'>The 5 January quiz tested players' knowledge of the fact that the mutating table error (ORA-04091) is raised differently for different ways of  performing inserts and with a BEFORE row-level trigger.&lt;br /&gt;
&lt;br /&gt;
Iudith Mentzel took the quiz as a starting point for some very interesting analysis, which I share here.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;Hello Steven,&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="color: blue;"&gt;Following the quiz from January 5 about the mutating table error (ORA-04091), there was something in the explanation that arose my curiosity, so I tested it out and found something "half-strange".&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="color: blue;"&gt;Namely, it is the explanation of the correct choice [8740] that says the following:&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="color: blue;"&gt;"Oracle does not raise the mutating table error for the first row inserted. When it attempts to insert the row for the second element in the collection, the mutating table error is raised."&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="color: blue;"&gt;I performed the test below to prove that this is indeed the case and found the following:&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;pre style="color: #0c343d;"&gt;CREATE TABLE plch_parts (
   partnum    NUMBER
 , partname   VARCHAR2 (30)
)
/

Table created.

CREATE OR REPLACE TRIGGER plch_parts_bir
   BEFORE INSERT
   ON plch_parts
   FOR EACH ROW
DECLARE
   cnt   NUMBER;
BEGIN
   -- just a control message
   DBMS_OUTPUT.put_line('BEFORE ROW trigger fired for '|| TO_CHAR(:new.partnum) );
   SELECT COUNT (*) INTO cnt FROM plch_parts;
END;
/

Trigger created.

/*
   Here we see that the mutating error happened indeed on the 2-nd row only,
   but it caused a rollback of the 1-st inserted row as well.
   This is usually NOT the case in a FORALL statement failure (for some other error),
   the results of the previous successful iterations are (generally) NOT rolled back
*/

DECLARE
   TYPE plch_parts_t IS TABLE OF plch_parts%ROWTYPE
                           INDEX BY PLS_INTEGER;
   t   plch_parts_t;
   cnt  NUMBER;
BEGIN
   t (1).partnum := 1;
   t (1).partname := 'A';
   t (2).partnum := 2;
   t (2).partname := 'B';

   FORALL i IN INDICES OF t
      INSERT INTO plch_parts
           VALUES t (i);
EXCEPTION
     WHEN OTHERS THEN
          DBMS_OUTPUT.put_line(SQLERRM);
        
          /* if the row inserted by the first iteration is not rolled back
             then here we should see "COUNT=1" */

          SELECT COUNT(*) INTO cnt FROM plch_parts;
          DBMS_OUTPUT.put_line('COUNT='||cnt);
END;
/

BEFORE ROW trigger fired for 1
BEFORE ROW trigger fired for 2

ORA-04091: table SCOTT.PLCH_PARTS is mutating, trigger/function may not see it
ORA-06512: at "SCOTT.PLCH_PARTS_BIR", line 7
ORA-04088: error during execution of trigger 'SCOTT.PLCH_PARTS_BIR'&lt;/pre&gt;&lt;pre style="color: #0c343d;"&gt;COUNT=0  =====&amp;gt;  this is strange  !!!

PL/SQL procedure successfully completed.

/*
   If we add a SAVE EXCEPTIONS , then the 1-st inserted row is NOT rolled back
   which is the expected behavior.

   However, the error displayed by SQLERRM is ORA-04091 and not the usual ORA-24381,
   which shows that in this case the entire FORALL is handled like a "single multirow INSERT",
   and not like an "array of (separate) INSERTS", as FORALL usually behaves.

   In spite of this, it does preserve the 1-st row inserted,
   so it only behaves "partially" as a FORALL ... SAVE EXCEPTIONS statement.
*/

DECLARE
   TYPE plch_parts_t IS TABLE OF plch_parts%ROWTYPE
                           INDEX BY PLS_INTEGER;

   t   plch_parts_t;
   cnt  NUMBER;
BEGIN
   t (1).partnum := 1;
   t (1).partname := 'A';
   t (2).partnum := 2;
   t (2).partname := 'B';

   FORALL i IN INDICES OF t SAVE EXCEPTIONS
      INSERT INTO plch_parts
           VALUES t (i);
EXCEPTION
     WHEN OTHERS THEN
          /* here we expect ORA-24381, and not ORA-04091,
             if the later is raised for the 2-nd row */
          DBMS_OUTPUT.put_line(SQLERRM);

          /* if the row inserted by the first iteration is not rolled back
             then here we should see "COUNT=1" */

          SELECT COUNT(*) INTO cnt FROM plch_parts;

          DBMS_OUTPUT.put_line('COUNT='||cnt);
          DBMS_OUTPUT.put_line('ERRORS='||SQL%BULK_EXCEPTIONS.COUNT);

          FOR i IN 1 .. SQL%BULK_EXCEPTIONS.COUNT
          LOOP
             DBMS_OUTPUT.put_line(&lt;/pre&gt;&lt;pre style="color: #0c343d;"&gt;'ERROR('||i||')='||SQL%BULK_EXCEPTIONS(i).ERROR_INDEX ||
                 '( '||SQL%BULK_EXCEPTIONS(i).ERROR_CODE||' )' );
          END LOOP;

END;
/

BEFORE ROW trigger fired for 1
BEFORE ROW trigger fired for 2

ORA-04091: table SCOTT.PLCH_PARTS is mutating, trigger/function may not see it
ORA-06512: at "SCOTT.PLCH_PARTS_BIR", line 7
ORA-04088: error during execution of trigger 'SCOTT.PLCH_PARTS_BIR'

COUNT=1  =====&amp;gt; this is expected, but strange for a non-ORA-24381 error !&lt;/pre&gt;&lt;pre style="color: blue;"&gt;&lt;span style="color: #0c343d;"&gt;
ERRORS=1
ERROR(1)=2( 4091 )

PL/SQL procedure successfully completed.&lt;/span&gt;
&lt;/pre&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="color: blue;"&gt;I checked the above in both 11.1.0.7.0 and 11.2.0.1.0 and the behavior is the same. I wonder whether there are other cases for which we can see something similar.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-2708240558598558603?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/2708240558598558603/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2012/01/exploring-mutating-table-errors-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/2708240558598558603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/2708240558598558603'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2012/01/exploring-mutating-table-errors-and.html' title='Exploring Mutating Table Errors and FORALL (9619)'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-3966710555028332843</id><published>2012-01-07T16:58:00.001Z</published><updated>2012-01-07T17:00:53.500Z</updated><title type='text'>Fact Mining and the Weekly Logic Quiz (10983)</title><content type='html'>In addition to the PL/SQL, SQL and APEX quizzes, the PL/SQL Challenge offers a weekly logic puzzle, modeled on the Mastermind game.&lt;br /&gt;
&lt;br /&gt;
In the puzzle for the first week of 2012, the second choice (9084) stated:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;"If 1 is in the solution, then 7 cannot be in solution."&lt;/div&gt;&lt;br /&gt;
This was scored as correct and offered a step-by-step logical "proof" of why this was so.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, as several players pointed out, my logic was flawed from the very start - because &lt;i&gt;1 could not be in the solution at all&lt;/i&gt;. As Jennifer explained so clearly:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;"We know from the clues that 1 cannot be in the solution. Based on the 3rd clue  that only one of the set '2143' is in the solution, we know that 5,6, and 7 must  be in the solution. Therefore 1 cannot be in the solution because the 2nd clue  states that only 2 of '1456' is in the solution. We know that 5 and 6 must be so  1 and 4 cannot be." &lt;/div&gt;&lt;br /&gt;
I will change that choice to incorrect; everyone's scores will be updated within the next 24 hours.&lt;br /&gt;
&lt;br /&gt;
While I am unhappy with my error and the need to issue a correction, I am delighted that several players analyzed the puzzle closely enough to uncover the problem - and also because this process reinforces what is to me one of the most important lessons for programmers when playing Mastermind (and similar games): &lt;br /&gt;
&lt;br /&gt;
Make sure that you fully "mine" all "clues" (results from tests of your code) for all possible information.&lt;br /&gt;
&lt;br /&gt;
All too often we (I!) barely look at the results of a test, or the report of a bug, before we rush to the source code and scramble (flail around?)&amp;nbsp; to apply a fix. In doing so, we (I) often overlook critical information, and this oversight can lead to lots of time lost and even the introduction of new bugs.&lt;br /&gt;
&lt;br /&gt;
In this puzzle, I did not perform enough analysis to conclude that 1 could not be in the solution. By missing this fact, I then introduced a mistake into the quiz.&lt;br /&gt;
&lt;br /&gt;
Lesson learned: before you start messing around with your code, make sure you have extracted all possible conclusions from tests and specifications. Then apply that knowledge in a systematic fashion.&lt;br /&gt;
&lt;br /&gt;
Thanks to Jennifer, DKennedy, Bobby and Pavel for identifying this problem!&lt;br /&gt;
&lt;br /&gt;
Steven&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-3966710555028332843?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/3966710555028332843/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2012/01/fact-mining-and-weekly-logic-quiz.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/3966710555028332843'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/3966710555028332843'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2012/01/fact-mining-and-weekly-logic-quiz.html' title='Fact Mining and the Weekly Logic Quiz (10983)'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-3420698969330827305</id><published>2012-01-07T16:11:00.001Z</published><updated>2012-01-14T20:10:25.012Z</updated><title type='text'>Hapy New Year and Participants in Q4 2011 Playoff</title><content type='html'>I hope you enjoyed some relaxing and joyful times with family and friends...ah, but it is all over so fast. Fortunately, at least in Chicago, it doesn't seem like winter has actually arrived. Today, 5 January, the temperature is in the 50s (Fahrenheit; 10 degrees Celsius). I tore myself away from my beloved laptop to spend time on my bicycle. Ah, that was very nice...&lt;br /&gt;
&lt;br /&gt;
Well, regardless of the temperature, it's time to get back to work - and fun: back to answering PL/SQL, SQL and APEX quizzes...and it's also time for the Q4 2011 championship playoff.&lt;br /&gt;
&lt;br /&gt;
You will find below the list of players who have qualified, either through ranking, correctness or wildcard. The number in parentheses are the number of playoffs in which the player has previously participated. Which means 11 players have never participated in a playoff before. Watch out, seasoned players, for some hot competition.&lt;br /&gt;
&lt;br /&gt;
Congratulations to everyone on the list and best of luck in the playoff!&lt;br /&gt;
&lt;br /&gt;
We will soon announce the date of the playoff, after confirming availability with players.&lt;br /&gt;
&lt;br /&gt;
Warm regards to all,&lt;br /&gt;
Steven Feuerstein&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;b&gt;Players in the Q4 2011 Championship Playoff&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;table style="border-collapse: collapse; border: 1px solid blue;"&gt;&lt;tbody&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt; &lt;th style="width: 30%;"&gt;Name&lt;/th&gt; &lt;th style="width: 10%;"&gt;Rank&lt;/th&gt; &lt;th style="width: 20%;"&gt;Qualification&lt;/th&gt; &lt;th style="width: 30%;"&gt;Country&lt;/th&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Alain Boulianne (1)&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;French Republic&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Stelios Vlasopoulos (1)&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;Greece&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Frank Schrader (5)&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;Germany&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Valentin Nikotin (3)**&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;Russia&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Syed Ariful Bari (1)&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;Bangladesh&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Ninoslav Čerkez (1)&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;Croatia&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Viacheslav Stepanov (3)&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;Russia&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Chris Saxon (2)&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;United Kingdom&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;mentzel.iudith (4)&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;Israel&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;kowido (3)&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;No Country Set&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Chad Lee (2)&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;United States&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;monpara.sanjay (0)&lt;/td&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;India&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Mike Pargeter (4)&lt;/td&gt;&lt;td&gt;13&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;United Kingdom&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Jeff Kemp (6)&lt;/td&gt;&lt;td&gt;14&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;Australia&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Janis Baiza (3)&lt;/td&gt;&lt;td&gt;15&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;Latvia&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Kevan Gelling (3)&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;Isle of Man&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Hrvoje Torbašinović (2)&lt;/td&gt;&lt;td&gt;17&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;Croatia&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Randy Gettman (4)&lt;/td&gt;&lt;td&gt;18&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;United States&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Siim Kask (4)&lt;/td&gt;&lt;td&gt;19&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;Estonia&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Dejan Topalovic (1)&lt;/td&gt;&lt;td&gt;20&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;Austria&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Jerry Bull (2)&lt;/td&gt;&lt;td&gt;21&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;United States&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Anna Onishchuk (3)&lt;/td&gt;&lt;td&gt;22&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;Ireland&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;_tiki_4_ (0)&lt;/td&gt;&lt;td&gt;23&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;Germany&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;james su (3)&lt;/td&gt;&lt;td&gt;24&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;Canada&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Niels Hecker (5)&lt;/td&gt;&lt;td&gt;25&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;Germany&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Andre van der Put (0)&lt;/td&gt;&lt;td&gt;26&lt;/td&gt;&lt;td&gt;Wildcard&lt;/td&gt;&lt;td&gt;Netherlands&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;John Hall (3)&lt;/td&gt;&lt;td&gt;27&lt;/td&gt;&lt;td&gt;Correctness&lt;/td&gt;&lt;td&gt;United States&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Yuan Tschang (1)&lt;/td&gt;&lt;td&gt;29&lt;/td&gt;&lt;td&gt;Correctness&lt;/td&gt;&lt;td&gt;United States&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Justin Michael Raj (0)&lt;/td&gt;&lt;td&gt;56&lt;/td&gt;&lt;td&gt;Wildcard&lt;/td&gt;&lt;td&gt;India&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Nina (0)&lt;/td&gt;&lt;td&gt;58&lt;/td&gt;&lt;td&gt;Wildcard&lt;/td&gt;&lt;td&gt;Russia&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Joaquin Gonzalez (3)&lt;/td&gt;&lt;td&gt;60&lt;/td&gt;&lt;td&gt;Correctness&lt;/td&gt;&lt;td&gt;Spain&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Dalibor Kovač (3)&lt;/td&gt;&lt;td&gt;61&lt;/td&gt;&lt;td&gt;Correctness&lt;/td&gt;&lt;td&gt;Croatia&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Frank Schmitt (0)&lt;/td&gt;&lt;td&gt;82&lt;/td&gt;&lt;td&gt;Wildcard&lt;/td&gt;&lt;td&gt;Germany&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;ZoltanKekes (1)&lt;/td&gt;&lt;td&gt;83&lt;/td&gt;&lt;td&gt;Correctness&lt;/td&gt;&lt;td&gt;United States&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Gideon Bruggink (0)&lt;/td&gt;&lt;td&gt;103&lt;/td&gt;&lt;td&gt;Correctness&lt;/td&gt;&lt;td&gt;Netherlands&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Vincent Malgrat (0)&lt;/td&gt;&lt;td&gt;108&lt;/td&gt;&lt;td&gt;Correctness&lt;/td&gt;&lt;td&gt;French Republic&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;sbramhe (2)&lt;/td&gt;&lt;td&gt;123&lt;/td&gt;&lt;td&gt;Wildcard&lt;/td&gt;&lt;td&gt;No Country Set&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Dennis Klemme (5)&lt;/td&gt;&lt;td&gt;146&lt;/td&gt;&lt;td&gt;Wildcard&lt;/td&gt;&lt;td&gt;Germany&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;andrewc (0)&lt;/td&gt;&lt;td&gt;206&lt;/td&gt;&lt;td&gt;Correctness&lt;/td&gt;&lt;td&gt;New Zealand&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;dsinagl (0)&lt;/td&gt;&lt;td&gt;313&lt;/td&gt;&lt;td&gt;Correctness&lt;/td&gt;&lt;td&gt;No Country Set&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Pedro Bravet (0)&lt;/td&gt;&lt;td&gt;436&lt;/td&gt;&lt;td&gt;Correctness&lt;/td&gt;&lt;td&gt;Spain&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
**Valentin Nikotin was incorrectly left off the initial list of participants because in Q1 2012, he changed to non-competitive play so that he could help the PL/SQL Challenge by writing lots of quizzes. Due to a bug in our algorithms, that left him out of the qualifying process for the playoff. So we have added him into the playoff, and also kept Andre van der Put in the playoff (he is now ranked 26th) as a Wildcard player.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-3420698969330827305?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/3420698969330827305/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2012/01/hapy-new-year-and-participants-in-q4.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/3420698969330827305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/3420698969330827305'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2012/01/hapy-new-year-and-participants-in-q4.html' title='Hapy New Year and Participants in Q4 2011 Playoff'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-6944004593024092980</id><published>2011-12-30T16:37:00.001Z</published><updated>2011-12-30T16:40:11.898Z</updated><title type='text'>What is a "Generic" Oracle Error Message? (9614)</title><content type='html'>The 29 December quiz tested your knowledge of the differences between various ways of raising errors and communicating error messages to users. It was a &lt;i&gt;word&lt;/i&gt;-based quiz, as opposed to one that is mostly code so - no surprise - a number of players raised objections to some of the phrasing and scoring.&lt;br /&gt;
&lt;br /&gt;
Let's go through these objections and see how much we can learn about PL/SQL through the process. Player comments are in &lt;span style="color: blue;"&gt;blue&lt;/span&gt;. My response is in &lt;span style="color: purple;"&gt;purple&lt;/span&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Choice 8990:&amp;nbsp; Both the PEI and RAE implementations allow you  to set the error code to one that is not used by Oracle and is returned by a  call to SQLCODE.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;A player wrote&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="color: blue;"&gt;1. PEI allows code from -20000...-20999, but not only such  codes;&amp;nbsp;&lt;/div&gt;&lt;div style="color: blue;"&gt;2. Several codes from -20000...-20999 is used by Oracle, for example: "ORA-20000: ORU-10027: buffer overflow, limit of 2000 bytes" &lt;/div&gt;&lt;div style="color: blue;"&gt;3. Is it unambiguous to say that outside this  range all codes are used by Oracle, for example, does "ORA-22567: Message 22567  not found; product=RDBMS; facility=ORA" mean that it's used by Oracle?&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;span style="color: purple;"&gt;My response: you are absolutely right that Oracle does, in a few packages, use some of "our" error codes, such as ORA-20000 and ORA-20000. I've always felt that this was rude behavior on Oracle's part. We only get 1000 error codes with which to work; surely, you could leave all of those to us! So good point, but I don't think it makes this choice wrong in any way. With both those implementations, I &lt;i&gt;can&lt;/i&gt; choose to set the error code to one that is not used by Oracle (such as -20704). The choice does &lt;i&gt;not &lt;/i&gt;claim that it is impossible for me to choose a code that Oracle also uses.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;span style="color: purple;"&gt;As to which codes Oracle "uses" - no, I would say that at least for now, -22567 is not in use.&lt;/span&gt; &lt;span style="color: purple;"&gt;But it is certainly the case that Oracle &lt;/span&gt;&lt;i style="color: purple;"&gt;could&lt;/i&gt;&lt;span style="color: purple;"&gt; at some point use these error codes - and we cannot.&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;Choice 8989: PEI and VE offer "generic" Oracle error messages, while RAE provides an application-specific error message.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Two players raised questions about this choice, and both circle back to the use of the word "generic". My intention behind the use of this word, combined with the "Oracle error message" phrase, is that these are the error messages returned by Oracle and are the same across all installations of Oracle.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;&lt;/div&gt;&lt;div style="color: blue;"&gt;I marked answer 8989 as "Incorrect" because PEI uses an application-specific  exception - i.e. it's not a "generic" Oracle error. I didn't realize this answer  was about the error *message text* in particular. Seems like this answer was a  bit ambiguous.&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="color: black;"&gt;and&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;
I disagree that "RAISE VALUE_ERROR" raises a "generic" error. It raises  the very  specific error associated with ORA-06502.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: black;"&gt;and&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
When you use PRAGMA EXCEPTION_INIT to change the error code of a user-defined exception, then the error message returned by SQLERRM or DBMS_UTILITY.FORMAT_ERROR_STACK is not generic, it is &lt;i&gt;blank&lt;/i&gt;. So I’d suggest that while VE offers a "generic" Oracle error message and  RAE provides an application-specific error message that PEI does  neither.&amp;nbsp; &lt;/div&gt;&lt;br /&gt;
&lt;div style="color: purple;"&gt;My response: the text of the choice is clearly about messages. And my point in this choice is that with the EXCEPTION_INIT pragma, you can change the error code associated with a named exception, but you cannot change the error message. As for VALUE_ERROR resulting in a specific rather than generic error message, I could understand this objection if I wrote the choice as follows:&lt;/div&gt;&lt;div style="color: purple;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="color: purple;"&gt;&lt;b&gt;PEI and VE offer a single "generic" Oracle error message, while RAE provides an application-specific error message.&lt;/b&gt;&lt;/div&gt;&lt;div style="color: purple;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="color: purple;"&gt;That is, if I said or implied there was just one "generic" message. But I use the plural form, so I feel it is clear that I am talking about the error messages returned by Oracle, which cannot be changed by the developer with EXCEPTION_INIT or RAISE.&lt;/div&gt;&lt;div style="color: purple;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="color: purple;"&gt;So is a blank message "generic"? If you do not use EXCEPTION_INIT with a user-defined exception, then the error message is, well, &lt;i&gt;generic&lt;/i&gt;: "User-defined error". When you assign a different error code to a user-defined exception, the error message is then blank. Gee, I don't know, that seems rather generic to me!&lt;/div&gt;&lt;br /&gt;
Your thoughts?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-6944004593024092980?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/6944004593024092980/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/12/what-is-generic-oracle-error-message.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/6944004593024092980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/6944004593024092980'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/12/what-is-generic-oracle-error-message.html' title='What is a &quot;Generic&quot; Oracle Error Message? (9614)'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-3787732105255057111</id><published>2011-12-28T20:20:00.000Z</published><updated>2011-12-28T20:20:48.969Z</updated><title type='text'>Thanks for a Great Year!</title><content type='html'>As 2011 comes to a close, I would like to thank the thousands of players who have played the quizzes at the PL/SQL Challenge, especially the daily PL/SQL quiz, and who have also volunteered their time to write quizzes, edit and review quizzes, and provide many ideas for ways to improve the website.&lt;br /&gt;
&lt;br /&gt;
At the PL/SQL Challenge website this year, 4,670 Oracle technologists from 104 countries spent over 32,000 hours submitting 213,077 answers to quizzes. These numbers reflect a very impressive commitment by all these players to improving their skill set in PL/SQL, SQL and APEX.&lt;br /&gt;
&lt;br /&gt;
I am grateful beyond words to our reviewers, listed below with the number of questions they reviewed in parentheses:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;Michael Brunstedt (270)&lt;/div&gt;&lt;div style="color: blue;"&gt;Ken Holmslykke (175)&lt;/div&gt;&lt;div style="color: blue;"&gt;Elic (172)&lt;/div&gt;&lt;div style="color: blue;"&gt;Darryl Hurley (129)&lt;/div&gt;&lt;div style="color: blue;"&gt;Kim Berg Hansen (25)&lt;/div&gt;&lt;div style="color: blue;"&gt;Patrick Barel (18)&lt;/div&gt;&lt;div style="color: blue;"&gt;Viji Thatai (6)&lt;/div&gt;&lt;div style="color: blue;"&gt;Munky (3)&lt;/div&gt;&lt;br /&gt;
The impact of our reviewers can be seen most clearly in the reduction in errors in our quizzes. In the eight months of play in 2010, we issued corrections for 31 quizzes. In all of 2011, with the addition of SQL and APEX quizzes, we only needed to issue corrections for 20 quizzes. And since January 2011, there have never been more than 2 corrections in a month. That's still too many - &lt;b&gt;and I take full responsibility for all errors!&lt;/b&gt; - but it is certainly a big improvement. I expect to see the number decrease further in 2012.&lt;br /&gt;
&lt;br /&gt;
Next, my thanks to the following players who found the time to submit quizzes that were then played in 2011, listed below with the number of questions authored in parentheses:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;_Nikotin (8) &lt;/div&gt;&lt;div style="color: blue;"&gt;Kim Berg Hansen (8) &lt;/div&gt;&lt;div style="color: blue;"&gt;mentzel.iudith (8) &lt;/div&gt;&lt;div style="color: blue;"&gt;koko (6) &lt;/div&gt;&lt;div style="color: blue;"&gt;Scott Wesley (5) &lt;/div&gt;&lt;div style="color: blue;"&gt;Jeff Kemp (5) &lt;/div&gt;&lt;div style="color: blue;"&gt;Patrick Barel (5) &lt;/div&gt;&lt;div style="color: blue;"&gt;Gary Myers (4) &lt;/div&gt;&lt;div style="color: blue;"&gt;Tim Hall (4) &lt;/div&gt;&lt;div style="color: blue;"&gt;Christian Rokitta (3) &lt;/div&gt;&lt;div style="color: blue;"&gt;Ken Holmslykke (3) &lt;/div&gt;&lt;div style="color: blue;"&gt;Joaquin Gonzalez (2) &lt;/div&gt;&lt;div style="color: blue;"&gt;anil_jha (2) &lt;/div&gt;&lt;div style="color: blue;"&gt;Vinod Kumar (2) &lt;/div&gt;&lt;div style="color: blue;"&gt;Sergey Porokh (2) &lt;/div&gt;&lt;div style="color: blue;"&gt;Jan Leers (iAdvise.be) (2) &lt;/div&gt;&lt;div style="color: blue;"&gt;Christopher Beck (2) &lt;/div&gt;&lt;div style="color: blue;"&gt;Chris Saxon (2) &lt;/div&gt;&lt;div style="color: blue;"&gt;Keith Hollins (1) &lt;/div&gt;&lt;div style="color: blue;"&gt;poelger (1) &lt;/div&gt;&lt;div style="color: blue;"&gt;Radoslav Golian (1) &lt;/div&gt;&lt;div style="color: blue;"&gt;Ramesh Samane (1) &lt;/div&gt;&lt;div style="color: blue;"&gt;Marc Thompson (1) &lt;/div&gt;&lt;div style="color: blue;"&gt;Alexander Polivany (1) &lt;/div&gt;&lt;div style="color: blue;"&gt;David Codl (1) &lt;/div&gt;&lt;div style="color: blue;"&gt;Oleg Borodin (1) &lt;/div&gt;&lt;div style="color: blue;"&gt;Viacheslav Stepanov (1) &lt;/div&gt;&lt;div style="color: blue;"&gt;Sreeguruparan PA (1) &lt;/div&gt;&lt;div style="color: blue;"&gt;D.J. Alexander (1) &lt;/div&gt;&lt;div style="color: blue;"&gt;Darryl Hurley (1) &lt;/div&gt;&lt;div style="color: blue;"&gt;senthil prakash  Muthu Irulappan (1) &lt;/div&gt;&lt;div style="color: blue;"&gt;Ralf Koelling (1) &lt;/div&gt;&lt;div style="color: blue;"&gt;Sohilkumar Bhavsar (1) &lt;/div&gt;&lt;div style="color: blue;"&gt;Neal Hawman (1) &lt;/div&gt;&lt;div style="color: blue;"&gt;David Alexander (1) &lt;/div&gt;&lt;div style="color: blue;"&gt;Randy Gettman (1) &lt;/div&gt;&lt;div style="color: blue;"&gt;Oleg  Gorskin (1) &lt;/div&gt;&lt;div style="color: blue;"&gt;Joni Vandenberghe (1) &lt;/div&gt;&lt;div style="color: blue;"&gt;voltrik (1) &lt;/div&gt;&lt;div style="color: blue;"&gt;Sailaja Pasupuleti (1) &lt;/div&gt;&lt;div style="color: blue;"&gt;Dennis Klemme (1) &lt;/div&gt;&lt;div style="color: blue;"&gt;Tony Winn (1) &lt;/div&gt;&lt;br /&gt;
Finally, we have been working on some exciting new features for quite awhile now, and it looks like 2012 is the year in which they will appear, so please be on the lookout for announcements of big changes at the PL/SQL Challenge site soon.&lt;br /&gt;
&lt;br /&gt;
Warmest holiday wishes to everyone!&lt;br /&gt;
Steven Feuerstein&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-3787732105255057111?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/3787732105255057111/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/12/thanks-for-great-year.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/3787732105255057111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/3787732105255057111'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/12/thanks-for-great-year.html' title='Thanks for a Great Year!'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-2676581900284637069</id><published>2011-12-21T13:50:00.005Z</published><updated>2011-12-21T13:59:04.493Z</updated><title type='text'>Are the Quizzes Too Long (Wordy)?</title><content type='html'>A player submitted this comment about the &lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:651:1041536417533379::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:8831,9607&amp;amp;cs=1F151F454E3B8B4C6B1D2FC473F04E4CF" TARGET="_blank"&gt;20 December quiz&lt;/a&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;The question of this quiz was too much long  and contained a lot of unnecessary information. I used a lot of time to read and understand  the question (279 seconds) while it was over the functionality of the simple built-in  function LAST_DAY.&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="color: blue;"&gt;This happens regularly in daily quizzes.  Lots of quiz players like me are not English native speakers. (My English is  very poor). We need to spend much time reading the  question to fully understand. Therefore, we are necessarily disadvantaged  as compared to the English speaking participants.&lt;/div&gt;&lt;br /&gt;
Looking back at this quiz, I realize that I introduced a table and data in the table when it really wasn't necessary. That lengthened the quiz and could have been avoided.&lt;br /&gt;
&lt;br /&gt;
So, definitely, this quiz could have been shortened and I am sure that many of the quizzes could be "stripped down" to the very basics.&lt;br /&gt;
&lt;br /&gt;
I would love to hear what you think about this. I will also create a poll about this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-2676581900284637069?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/2676581900284637069/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/12/are-quizzes-too-long-wordy.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/2676581900284637069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/2676581900284637069'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/12/are-quizzes-too-long-wordy.html' title='Are the Quizzes Too Long (Wordy)?'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-7657681438225860618</id><published>2011-12-19T14:31:00.000Z</published><updated>2011-12-19T14:31:16.476Z</updated><title type='text'>EXTEND and NOT NULL</title><content type='html'>The &lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:651:5842289202119670::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:9999,10775&amp;amp;cs=13941E45A622B54C9E8E39B5C6C2EB0E6"&gt;6 December quiz&lt;/a&gt; tested your knowledge of the effect of a NOT NULL constraint on a variable declaration, in this case through the declaration of a collection whose datatype is declared as NOT NULL.&lt;br /&gt;
&lt;br /&gt;
The last choice (8773) used a nested table as follows:&lt;br /&gt;
&lt;pre class="brush: sql"&gt;DECLARE
   l_string   VARCHAR2 (10);

   TYPE nt IS TABLE OF VARCHAR2 (10) NOT NULL;

   l_nt       nt := nt ();
BEGIN
   l_nt.EXTEND;
   l_nt (1) := l_string;
END;
&lt;/pre&gt;When Oracle attempts to assign l_string to an element in l_nt, a VALUE_ERROR exception is raised. So far, so good.&lt;br /&gt;
&lt;br /&gt;
But a player noticed something odd here. Marcus checked the documentation on EXTEND and found &lt;a href="http://docs.oracle.com/cd/E11882_01/appdev.112/e17126/composites.htm#CJAIJHEI"&gt;this&lt;/a&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="notep1" style="color: blue;"&gt;Note:&lt;/div&gt;&lt;div style="color: blue;"&gt; &lt;code&gt;EXTEND(&lt;/code&gt;&lt;code&gt;&lt;span class="codeinlineitalic"&gt;n&lt;/span&gt;&lt;/code&gt;,&lt;code&gt;&lt;span class="codeinlineitalic"&gt;i&lt;/span&gt;&lt;/code&gt;&lt;code&gt;)&lt;/code&gt; is the only form that you can use for a collection whose elements have the &lt;a href="" id="sthref470" name="sthref470"&gt;&lt;/a&gt;&lt;code&gt;NOT&lt;/code&gt; &lt;code&gt;NULL&lt;/code&gt; constraint.&lt;/div&gt;&lt;br /&gt;
Yet the call to EXTEND did &lt;i&gt;not&lt;/i&gt; raise an exception. Either the documentation is wrong or there is a bug in EXTEND. If it's the latter, it's a bug that has gone unnoticed for many versions. I have logged a comment to the Oracle Documentation team about this.&lt;br /&gt;
&lt;br /&gt;
Thanks, Marcus!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-7657681438225860618?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/7657681438225860618/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/12/extend-and-not-null.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/7657681438225860618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/7657681438225860618'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/12/extend-and-not-null.html' title='EXTEND and NOT NULL'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-3519718706117135690</id><published>2011-12-16T13:36:00.000Z</published><updated>2011-12-16T13:36:30.398Z</updated><title type='text'>%TYPE and RESULT_CACHE - Correction needed? (9604)</title><content type='html'>The 15 December quiz tested your knowledge of 11.2's ability to automatically detect when the contents&amp;nbsp; of a table on which a result cache function relies has been changed (and then invalidate the cache).&lt;br /&gt;
&lt;br /&gt;
Two players notified us that even though we scored the following choice as incorrect (which meant, in the context of this quiz, that a change to the table would &lt;i&gt;not&lt;/i&gt; invalidate the cache):&lt;br /&gt;
&lt;pre&gt;CREATE OR REPLACE FUNCTION plch_func (n IN NUMBER)
   RETURN NUMBER
   RESULT_CACHE
IS
   l_n   plch_tab1.n%TYPE := n;
BEGIN
   DBMS_OUTPUT.put_line ('Running plch_func');
   RETURN l_n;
END;
&lt;/pre&gt;The output from the verification does not support this conclusion.&lt;br /&gt;
&lt;br /&gt;
So, first: the reason that this version of the function should not result in an invalidation of the cache highlights the distinct between &lt;i&gt;dependencies&lt;/i&gt; between database objects and &lt;i&gt;"relies on" &lt;/i&gt;for a result cache.&lt;br /&gt;
&lt;br /&gt;
The plch_func function &lt;i&gt;depends on&lt;/i&gt; the plch_tab1 in the "traditional" sense: since there is a reference to the table in the function through the %TYPE declaration, when this table changes, the function is marked as invalid and will have to be recompiled (note that the Oracle11g fine-grained dependency feature reduces the scenarios under which this invalidation will occur).&lt;br /&gt;
&lt;br /&gt;
But that is a compile-time dependency, and very different from the "relies on" relationship that Oracle tracks automatically for purposes of ensuring clean data in a result cache. In other words, if the contents (but not the structure) of he plch_tab1 table changes, the compilation status of plch_func is not affected.&lt;br /&gt;
&lt;br /&gt;
This is not the case with the result cache feature, precisely because this cache is all about delivering &lt;i&gt;data&lt;/i&gt; (the &lt;i&gt;contents&lt;/i&gt; of the table) to users.&lt;br /&gt;
&lt;br /&gt;
So...that was the idea: if the only "mention" of plch_tab1 in plch_func is %TYPE, then that function does not rely on plch_tab1, and changes to that table will not force an invalidation and flush of its cache.&lt;br /&gt;
&lt;br /&gt;
Having said that, when I ran the verification code, I noticed that the output did not match my expectations. The first time I ran it, I saw this:&lt;br /&gt;
&lt;pre&gt;%TYPE Reference
1
1
&lt;/pre&gt;when I should have seen this:&lt;br /&gt;
&lt;pre&gt;%TYPE Reference
Running plch_func
1
1
&lt;/pre&gt;That seemed very strange. It was as though the compilation of the new version of the function did not flush the cache. I then put an update statement before the CREATE OR REPLACE to force the cache to be invalidated. Then I saw the expected results. Then I didn't believe that could possibly be necessary, so I removed the update statement and now &lt;i&gt;do&lt;/i&gt; see the expected results consistently:&lt;br /&gt;
&lt;pre&gt;%TYPE Reference
Running plch_func
1
1
&lt;/pre&gt;The two players who wrote in said they saw these results:&lt;br /&gt;
&lt;pre&gt;%TYPE Reference
Running plch_func
1
Running plch_func
1
&lt;/pre&gt;Very odd! I cannot reproduce that, for sure. I'd love to hear about the experiences of any players who have an 11.2 instance with which to work (11.1 still requires that you provide an explicit RELIES ON clause to specify the tables). I have also added that update statement to the verification code.&lt;br /&gt;
&lt;br /&gt;
Let me know what you discover!&lt;br /&gt;
&lt;br /&gt;
Thanks, Steven&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-3519718706117135690?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/3519718706117135690/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/12/type-and-resultcache-correction-needed.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/3519718706117135690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/3519718706117135690'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/12/type-and-resultcache-correction-needed.html' title='%TYPE and RESULT_CACHE - Correction needed? (9604)'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-8707396915833496682</id><published>2011-12-03T14:15:00.000Z</published><updated>2011-12-03T14:15:53.430Z</updated><title type='text'>The Pain of a Missing WHERE Clause Predicate</title><content type='html'>I sent the following email out to 1243 players today:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;Dear PL/SQL Challenge player,&amp;nbsp;&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="color: blue;"&gt;One of things I like most about the PL/SQL Challenge is that it keeps me  humble. I am reminded on an almost daily basis by one or more players that there  is lots for me learn about PL/SQL and the wider Oracle technology stack.&amp;nbsp;&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;div style="color: blue;"&gt;And then there are the moments of &lt;b&gt;deep, deep humility&lt;/b&gt; - such as when I  discover a nasty bug that has corrupted data in the PL/SQL Challenge repository.  Painful lessons, those.&amp;nbsp;&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;div style="color: blue;"&gt;Unfortunately, I write to you about precisely just such a moment. We  discovered recently that a DELETE statement was missing a critical predicate in  the WHERE clause (did a chill just run down &lt;i&gt;your &lt;/i&gt;spine, as it did me when I  realized what was happening?). As a result, if a player pressed the "Start Over"  button while taking the Oracle Magazine quiz, all the choices made by players  for this quiz were deleted.&amp;nbsp;&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;div style="color: blue;"&gt;This bug went undiscovered for quite a long time, so it is not possible to  recover the data. Instead, we are going to "wipe the slate clean", extend the  close date on these quizzes, and offer you the opportunity to take them again.&amp;nbsp;&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;div style="color: blue;"&gt;Look on the bright side: the second time around, you will likely answer  faster and with higher accuracy! &lt;/div&gt;&lt;div style="color: blue;"&gt;Our deepest apologies for wasting even a few moments of your time. I hope you  will continue to play the daily, weekly and monthly quizzes, thereby deepening  your expertise in key Oracle technologies.&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;span style="color: black;"&gt;Trying to look on the bright side of things, this same problem would have occurred if anyone competing in the quarterly championship playoff had pressed that same "Start Over" button (it is only visible when the competition has multiple quizzes in it). That would have wreaked havoc - and required me to come up with five more playoff-worthy quizzes.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;span style="color: black;"&gt;Still, I feel horrible that we would have made such a mistake and not noticed it testing; and that I would cause any player to have to re-do something they've done already.&lt;/span&gt;&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;span style="color: black;"&gt;I have extended the close date for the Sept/Oct quiz to the end of the year. I hope that you all will find the time to take the quiz before the end of the year. &lt;/span&gt;&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;span style="color: black;"&gt;Again, my apologies....&lt;/span&gt;&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;span style="color: black;"&gt;Steven Feuerstein &lt;/span&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-8707396915833496682?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/8707396915833496682/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/12/pain-of-missing-where-clause-predicate.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/8707396915833496682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/8707396915833496682'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/12/pain-of-missing-where-clause-predicate.html' title='The Pain of a Missing WHERE Clause Predicate'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-5299984991996182014</id><published>2011-12-03T13:58:00.000Z</published><updated>2011-12-03T13:58:27.942Z</updated><title type='text'>The Complex World of Indexing (10193)</title><content type='html'>The SQL quiz for the week ending 2 December tested your knowledge of the circumstances under which Oracle would use an index to optimize a SQL statement.&lt;br /&gt;
&lt;br /&gt;
Two players registered concerns about scoring the first choice as correct. This choice was:&lt;br /&gt;
&lt;pre&gt;SELECT last_name
  FROM plch_employees
 WHERE hire_date BETWEEN TO_DATE ('01-01-2010', 'MM-DD-YYYY')
                     AND TO_DATE ('12-31-2010', 'MM-DD-YYYY')
&lt;/pre&gt;My intention was to isolate a small enough sampling of the total data set so as to invoke the index - and to also point out (through other choices) that if you use the column inside an expression, the index will not be used.&lt;br /&gt;
&lt;br /&gt;
Here are the comment; I look forward to your thoughts.&lt;br /&gt;
&lt;br /&gt;
Steven Feuerstein &lt;br /&gt;
&lt;br /&gt;
1. I think, that the first choice for this quiz is ambiguous. The problem is, that  the query selects about 3% of the rows. With the index in place, the database  can choose either table full scan or index range scan followed by table access  by rowid to run the query. Based on the assumptions, it's impossible to tell,  which execution plan will be more efficient and hence whether the index improves  query performance. In real world situation, we could expect, that the table is  "almost" ordered by hire_date, which means that the clustering factor of the  index would be low and the index access path would be more efficient than full  table scan. However, there was no such assumption specified for this quiz. It  would be better to include last_name in the index or select just a single month  or a week instead of a year.&lt;br /&gt;
&lt;br /&gt;
2. I have performed some research around the topic of this quiz, just to verify a  little bit more deeper the case of choice number 1, which selects about 1/31 of  the rows ( 1 year out of 31 years ) and it seemed to be the most obvious among all the choices. But query optimization is a huge topic, never ending and always  dynamic, sometimes very frustrating and always exciting to research. I have performed some research around the topic of this quiz, just to verify a little bit more deeper the case of choice number 1, which selects about 1/31 of the rows ( 1 year out of 31 years ).&lt;br /&gt;
&lt;br /&gt;
That is, though the query returns about 3% of the rows only, this is still not a complete guaranty that the index will be used in any case. It highly depends on the clustering factor of the index, or, in other words, it depends on how the rows were loaded into the table, in which degree they were loaded ordered by the HIRE_DATE column.&lt;br /&gt;
&lt;br /&gt;
Below are two test cases, one in which the data is loaded with minimum clustering of the hire_date values (values generated in a circular fashion) and the other in which the values are highly clustered.&lt;br /&gt;
&lt;br /&gt;
In both cases I used a direct-path insert for creating the test data faster.Then, for each case, I created the index and checked the execution plan:&lt;br /&gt;
&lt;br /&gt;
a. without any statistics collected, which means that dynamic sampling will be used&lt;br /&gt;
b. with statistics collected using 20% sampling&lt;br /&gt;
c. with complete statistics collected.&lt;br /&gt;
Also, I use two slightly different queries:&lt;br /&gt;
&lt;br /&gt;
1. One query identical with that of choice 1 in the quiz:&lt;br /&gt;
&lt;pre&gt;SELECT last_name
  FROM plch_employees
 WHERE hire_date BETWEEN TO_DATE ('01-01-2010', 'MM-DD-YYYY')
                     AND TO_DATE ('12-31-2010', 'MM-DD-YYYY')
/
&lt;/pre&gt;2. One that selects the HIRE_DATE instead of the LAST_NAME&lt;br /&gt;
&lt;pre&gt;SELECT hire_date
  FROM plch_employees
 WHERE hire_date BETWEEN TO_DATE ('01-01-2010', 'MM-DD-YYYY')
                     AND TO_DATE ('12-31-2010', 'MM-DD-YYYY')
/
&lt;/pre&gt;The conclusions are as follows:&lt;br /&gt;
&lt;br /&gt;
1. When the rows are loaded cyclically by HIRE_DATE (not clustered, but dispersed), then the index is NOT used.  Here dynamic sampling accurately estimates cardinality.&lt;br /&gt;
&lt;br /&gt;
2. When the rows are loaded clustered by HIRE_DATE, then the index is always used, even for high cardinality estimated. Here dynamic sampling highly underestimates cardinality.&lt;br /&gt;
&lt;br /&gt;
3. The index is always used when the query can be resolved entirely using the index only ( ex. selecting HIRE_DATE instead of LAST_NAME ).&lt;br /&gt;
&lt;br /&gt;
See below the two test cases:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;SET TIMING ON
SET LINESIZE 130
SET PAGESIZE 0


----------------------------------------------------------
CASE 1 -- data loaded in a circular fashion
----------------------------------------------------------
CREATE TABLE plch_employees
(
   employee_id     INTEGER
,  last_name       VARCHAR2 (100)
,  first_name      VARCHAR2 (100)
,  hire_date       DATE
,  salary          NUMBER
)
/

Table created.

Elapsed: 00:00:02.02

-- create a test case (10,000,000 rows) using smaller steps to avoid error
-- ORA-30009: Not enough memory for CONNECT BY operation

DECLARE
   K  PLS_INTEGER;
BEGIN
   FOR I IN 1 .. 1000
   LOOP
       K := (I-1)*10000;

       INSERT /*+APPEND */ INTO plch_employees
       SELECT K+ROWNUM, 
              'ABC '||(K+ROWNUM),
              'XYZ '||(K+ROWNUM),
               TO_DATE('01011980','DDMMYYYY') + MOD(K+ROWNUM, 31*365),
               10000 + MOD(K+ROWNUM, 20000)
       FROM DUAL
       CONNECT BY LEVEL &amp;lt;= 10000 ;

       COMMIT;
   END LOOP;
END;
/

PL/SQL procedure successfully completed.

Elapsed: 00:01:59.05


CREATE INDEX i_plch_employees
ON plch_employees (hire_date)
/

Index created.

Elapsed: 00:00:50.02

-- check execution plans without any statistics (will use dynamic sampling)

/* TEST1: selecting LAST_NAME */

EXPLAIN PLAN SET STATEMENT_ID='T1' FOR
SELECT last_name
  FROM plch_employees
 WHERE hire_date BETWEEN TO_DATE ('01-01-2010', 'MM-DD-YYYY')
                     AND TO_DATE ('12-31-2010', 'MM-DD-YYYY')
/
Explained.

Elapsed: 00:00:00.07


select plan_table_output 
  from table(dbms_xplan.display('plan_table','T1','serial'))
/

------------------------------------------------------------------------------------
| Id  | Operation         | Name           | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |                |   326K|    50M|  6883  (10)| 00:00:27 |
|*  1 |  TABLE ACCESS FULL| PLCH_EMPLOYEES |   326K|    50M|  6883  (10)| 00:00:27 |
------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("HIRE_DATE"&amp;gt;=TO_DATE(' 2010-01-01 00:00:00', 'syyyy-mm-dd
              hh24:mi:ss') AND "HIRE_DATE"&amp;lt;=TO_DATE(' 2010-12-31 00:00:00', 'syyyy-mm-dd
              hh24:mi:ss'))

Note
-----
   - dynamic sampling used for this statement

19 rows selected.

Elapsed: 00:00:00.00

/* TEST2: selecting HIRE_DATE instead of LAST_NAME - index only access suffices */

EXPLAIN PLAN SET STATEMENT_ID='T2' FOR
SELECT hire_date
  FROM plch_employees
 WHERE hire_date BETWEEN TO_DATE ('01-01-2010', 'MM-DD-YYYY')
                     AND TO_DATE ('12-31-2010', 'MM-DD-YYYY')
/
Explained.

Elapsed: 00:00:00.00


select plan_table_output 
  from table(dbms_xplan.display('plan_table','T2','serial'))
/

-------------------------------------------------------------------------------------
| Id  | Operation        | Name             | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT |                  |   326K|  2866K|   869   (2)| 00:00:04 |
|*  1 |  INDEX RANGE SCAN| I_PLCH_EMPLOYEES |   326K|  2866K|   869   (2)| 00:00:04 |
-------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("HIRE_DATE"&amp;gt;=TO_DATE(' 2010-01-01 00:00:00', 'syyyy-mm-dd
              hh24:mi:ss') AND "HIRE_DATE"&amp;lt;=TO_DATE(' 2010-12-31 00:00:00', 'syyyy-mm-dd
              hh24:mi:ss'))

Note
-----
   - dynamic sampling used for this statement

19 rows selected.

Elapsed: 00:00:00.00

-- gather statistics with 20% sampling
BEGIN
    DBMS_STATS.GATHER_TABLE_STATS(USER,'PLCH_EMPLOYEES',
                                   cascade     =&amp;gt; TRUE,
                                   method_opt  =&amp;gt; 'FOR ALL INDEXED COLUMNS',
                                   estimate_percent =&amp;gt; 20);
END;
/

PL/SQL procedure successfully completed.

Elapsed: 00:00:46.00

/* TEST3: selecting LAST_NAME */

EXPLAIN PLAN SET STATEMENT_ID='T3' FOR
SELECT last_name
  FROM plch_employees
 WHERE hire_date BETWEEN TO_DATE ('01-01-2010', 'MM-DD-YYYY')
                     AND TO_DATE ('12-31-2010', 'MM-DD-YYYY')
/

Explained.

Elapsed: 00:00:01.04

select plan_table_output 
  from table(dbms_xplan.display('plan_table','T3','serial'))
/

------------------------------------------------------------------------------------
| Id  | Operation         | Name           | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |                |   315K|    12M|  6867  (10)| 00:00:26 |
|*  1 |  TABLE ACCESS FULL| PLCH_EMPLOYEES |   315K|    12M|  6867  (10)| 00:00:26 |
------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("HIRE_DATE"&amp;gt;=TO_DATE(' 2010-01-01 00:00:00', 'syyyy-mm-dd
              hh24:mi:ss') AND "HIRE_DATE"&amp;lt;=TO_DATE(' 2010-12-31 00:00:00', 'syyyy-mm-dd
              hh24:mi:ss'))

15 rows selected.

Elapsed: 00:00:00.03

/* TEST4: selecting HIRE_DATE instead of LAST_NAME - index only access suffices */

EXPLAIN PLAN SET STATEMENT_ID='T4' FOR
SELECT hire_date
  FROM plch_employees
 WHERE hire_date BETWEEN TO_DATE ('01-01-2010', 'MM-DD-YYYY')
                     AND TO_DATE ('12-31-2010', 'MM-DD-YYYY')
/

Explained.

Elapsed: 00:00:00.00

select plan_table_output 
  from table(dbms_xplan.display('plan_table','T4','serial'))
/

-------------------------------------------------------------------------------------
| Id  | Operation        | Name             | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT |                  |   315K|  2463K|   907   (2)| 00:00:04 |
|*  1 |  INDEX RANGE SCAN| I_PLCH_EMPLOYEES |   315K|  2463K|   907   (2)| 00:00:04 |
-------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("HIRE_DATE"&amp;gt;=TO_DATE(' 2010-01-01 00:00:00', 'syyyy-mm-dd
              hh24:mi:ss') AND "HIRE_DATE"&amp;lt;=TO_DATE(' 2010-12-31 00:00:00', 'syyyy-mm-dd
              hh24:mi:ss'))

15 rows selected.

Elapsed: 00:00:00.00

-- gather full statistics  -  almost same results as with 20%  
BEGIN
    DBMS_STATS.GATHER_TABLE_STATS(USER,'PLCH_EMPLOYEES',
                                   cascade     =&amp;gt; TRUE,
                                   method_opt  =&amp;gt; 'FOR ALL INDEXED COLUMNS',
                                   estimate_percent =&amp;gt; 99);
END;
/

PL/SQL procedure successfully completed.

Elapsed: 00:02:52.03

/* TEST5: selecting LAST_NAME */

EXPLAIN PLAN SET STATEMENT_ID='T5' FOR
SELECT last_name
  FROM plch_employees
 WHERE hire_date BETWEEN TO_DATE ('01-01-2010', 'MM-DD-YYYY')
                     AND TO_DATE ('12-31-2010', 'MM-DD-YYYY')
/
Explained.

Elapsed: 00:00:00.00

select plan_table_output 
  from table(dbms_xplan.display('plan_table','T5','serial'))
/

------------------------------------------------------------------------------------
| Id  | Operation         | Name           | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |                |   315K|    12M|  6867  (10)| 00:00:26 |
|*  1 |  TABLE ACCESS FULL| PLCH_EMPLOYEES |   315K|    12M|  6867  (10)| 00:00:26 |
------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("HIRE_DATE"&amp;gt;=TO_DATE(' 2010-01-01 00:00:00', 'syyyy-mm-dd
              hh24:mi:ss') AND "HIRE_DATE"&amp;lt;=TO_DATE(' 2010-12-31 00:00:00', 'syyyy-mm-dd
              hh24:mi:ss'))

15 rows selected.

Elapsed: 00:00:00.03

/* TEST6: selecting HIRE_DATE instead of LAST_NAME - index only access suffices */

EXPLAIN PLAN SET STATEMENT_ID='T6' FOR
SELECT hire_date
  FROM plch_employees
 WHERE hire_date BETWEEN TO_DATE ('01-01-2010', 'MM-DD-YYYY')
                     AND TO_DATE ('12-31-2010', 'MM-DD-YYYY')
/
Explained.

Elapsed: 00:00:00.00

select plan_table_output 
  from table(dbms_xplan.display('plan_table','T6','serial'))
/

-------------------------------------------------------------------------------------
| Id  | Operation        | Name             | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT |                  |   315K|  2462K|   853   (2)| 00:00:04 |
|*  1 |  INDEX RANGE SCAN| I_PLCH_EMPLOYEES |   315K|  2462K|   853   (2)| 00:00:04 |
-------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("HIRE_DATE"&amp;gt;=TO_DATE(' 2010-01-01 00:00:00', 'syyyy-mm-dd
              hh24:mi:ss') AND "HIRE_DATE"&amp;lt;=TO_DATE(' 2010-12-31 00:00:00', 'syyyy-mm-dd
              hh24:mi:ss'))

15 rows selected.

Elapsed: 00:00:00.00


DROP TABLE plch_employees
/

----------------------------------------------------------
CASE 2 -- data loaded clustered by HIRE_DATE
----------------------------------------------------------
CREATE TABLE plch_employees
(
   employee_id     INTEGER
,  last_name       VARCHAR2 (100)
,  first_name      VARCHAR2 (100)
,  hire_date       DATE
,  salary          NUMBER
)
/

Table created.

Elapsed: 00:00:02.02

DECLARE
   K  PLS_INTEGER;
   N  PLS_INTEGER := TRUNC(10000000 / (31*365));
BEGIN
   FOR I IN 1 .. 1000
   LOOP
       K := (I-1)*10000;

       INSERT /*+APPEND */ INTO plch_employees
       SELECT K+ROWNUM, 
              'ABC '||(K+ROWNUM),
              'XYZ '||(K+ROWNUM),
               TO_DATE('01011980','DDMMYYYY') + FLOOR( (K+ROWNUM)/ N ),
               10000 + MOD(K+ROWNUM, 20000)
       FROM DUAL
       CONNECT BY LEVEL &amp;lt;= 10000 ;

       COMMIT;
   END LOOP;
END;
/

PL/SQL procedure successfully completed.

Elapsed: 00:01:51.00

-- check correct (expected) distribution
SELECT COUNT(*)
  FROM plch_employees
 WHERE hire_date BETWEEN TO_DATE ('01-01-2010', 'MM-DD-YYYY')
                     AND TO_DATE ('12-31-2010', 'MM-DD-YYYY')
/

  COUNT(*)
----------
    322295

1 row selected.

Elapsed: 00:00:13.04

CREATE INDEX i_plch_employees ON plch_employees (hire_date)
/

Index created.

Elapsed: 00:00:47.01

/* TEST1: selecting LAST_NAME --&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;now index is used, though wrong cardinality estimation ! */

EXPLAIN PLAN SET STATEMENT_ID='T1' FOR
SELECT last_name
  FROM plch_employees
 WHERE hire_date BETWEEN TO_DATE ('01-01-2010', 'MM-DD-YYYY')
                     AND TO_DATE ('12-31-2010', 'MM-DD-YYYY')
/
Explained.

Elapsed: 00:00:00.00

------------------------------------------------------------------------------------------------
| Id  | Operation                   | Name             | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                  |  2500 |   393K|    26   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| PLCH_EMPLOYEES   |  2500 |   393K|    26   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | I_PLCH_EMPLOYEES |  2500 |       |     9   (0)| 00:00:01 |
------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("HIRE_DATE"&amp;gt;=TO_DATE(' 2010-01-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss')
              AND "HIRE_DATE"&amp;lt;=TO_DATE(' 2010-12-31 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))

Note
-----
   - dynamic sampling used for this statement

19 rows selected.

Elapsed: 00:00:00.04


/* TEST2: selecting HIRE_DATE instead of LAST_NAME - index only access suffices */

EXPLAIN PLAN SET STATEMENT_ID='T2' FOR
SELECT hire_date
  FROM plch_employees
 WHERE hire_date BETWEEN TO_DATE ('01-01-2010', 'MM-DD-YYYY')
                     AND TO_DATE ('12-31-2010', 'MM-DD-YYYY')
/

Explained.

Elapsed: 00:00:00.00

-------------------------------------------------------------------------------------
| Id  | Operation        | Name             | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT |                  |  2500 | 22500 |     9   (0)| 00:00:01 |
|*  1 |  INDEX RANGE SCAN| I_PLCH_EMPLOYEES |  2500 | 22500 |     9   (0)| 00:00:01 |
-------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("HIRE_DATE"&amp;gt;=TO_DATE(' 2010-01-01 00:00:00', 'syyyy-mm-dd
              hh24:mi:ss') AND "HIRE_DATE"&amp;lt;=TO_DATE(' 2010-12-31 00:00:00', 'syyyy-mm-dd
              hh24:mi:ss'))

Note
-----
   - dynamic sampling used for this statement

19 rows selected.

Elapsed: 00:00:00.01


-- gather statistics with 20% sampling
BEGIN
    DBMS_STATS.GATHER_TABLE_STATS(USER,'PLCH_EMPLOYEES',
                                   cascade     =&amp;gt; TRUE,
                                   method_opt  =&amp;gt; 'FOR ALL INDEXED COLUMNS',
                                   estimate_percent =&amp;gt; 20);
END;
/
PL/SQL procedure successfully completed.

Elapsed: 00:00:48.02


/* TEST3: selecting LAST_NAME - now with correct (much higher) cardinality, index still used ! */

EXPLAIN PLAN SET STATEMENT_ID='T3' FOR
SELECT last_name
  FROM plch_employees
 WHERE hire_date BETWEEN TO_DATE ('01-01-2010', 'MM-DD-YYYY')
                     AND TO_DATE ('12-31-2010', 'MM-DD-YYYY')
/
Explained.

Elapsed: 00:00:00.00

------------------------------------------------------------------------------------------------
| Id  | Operation                   | Name             | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                  |   318K|    12M|  3160   (2)| 00:00:12 |
|   1 |  TABLE ACCESS BY INDEX ROWID| PLCH_EMPLOYEES   |   318K|    12M|  3160   (2)| 00:00:12 |
|*  2 |   INDEX RANGE SCAN          | I_PLCH_EMPLOYEES |   318K|       |   861   (2)| 00:00:04 |
------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("HIRE_DATE"&amp;gt;=TO_DATE(' 2010-01-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss')
              AND "HIRE_DATE"&amp;lt;=TO_DATE(' 2010-12-31 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))

15 rows selected.

Elapsed: 00:00:00.00


/* TEST4: selecting HIRE_DATE instead of LAST_NAME - index only access suffices */

EXPLAIN PLAN SET STATEMENT_ID='T4' FOR
SELECT hire_date
  FROM plch_employees
 WHERE hire_date BETWEEN TO_DATE ('01-01-2010', 'MM-DD-YYYY')
                     AND TO_DATE ('12-31-2010', 'MM-DD-YYYY')
/
Explained.

Elapsed: 00:00:00.00

-------------------------------------------------------------------------------------
| Id  | Operation        | Name             | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT |                  |   318K|  2490K|   861   (2)| 00:00:04 |
|*  1 |  INDEX RANGE SCAN| I_PLCH_EMPLOYEES |   318K|  2490K|   861   (2)| 00:00:04 |
-------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("HIRE_DATE"&amp;gt;=TO_DATE(' 2010-01-01 00:00:00', 'syyyy-mm-dd
              hh24:mi:ss') AND "HIRE_DATE"&amp;lt;=TO_DATE(' 2010-12-31 00:00:00', 'syyyy-mm-dd
              hh24:mi:ss'))

15 rows selected.

Elapsed: 00:00:00.00


-- gather full statistics  -  almost same results as with 20%  
BEGIN
    DBMS_STATS.GATHER_TABLE_STATS(USER,'PLCH_EMPLOYEES',
                                   cascade     =&amp;gt; TRUE,
                                   method_opt  =&amp;gt; 'FOR ALL INDEXED COLUMNS',
                                   estimate_percent =&amp;gt; 99);
END;
/

PL/SQL procedure successfully completed.

Elapsed: 00:02:42.05

/* TEST5: selecting LAST_NAME -&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;now with correct (much higher) cardinality, index still used ! */

EXPLAIN PLAN SET STATEMENT_ID='T5' FOR
SELECT last_name
  FROM plch_employees
 WHERE hire_date BETWEEN TO_DATE ('01-01-2010', 'MM-DD-YYYY')
                     AND TO_DATE ('12-31-2010', 'MM-DD-YYYY')
/
Explained.

Elapsed: 00:00:00.00

------------------------------------------------------------------------------------------------
| Id  | Operation                   | Name             | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                  |   321K|    12M|  3035   (2)| 00:00:12 |
|   1 |  TABLE ACCESS BY INDEX ROWID| PLCH_EMPLOYEES   |   321K|    12M|  3035   (2)| 00:00:12 |
|*  2 |   INDEX RANGE SCAN          | I_PLCH_EMPLOYEES |   321K|       |   868   (2)| 00:00:04 |
------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("HIRE_DATE"&amp;gt;=TO_DATE(' 2010-01-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss')
              AND "HIRE_DATE"&amp;lt;=TO_DATE(' 2010-12-31 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))

15 rows selected.

Elapsed: 00:00:00.00


/* TEST6: selecting HIRE_DATE instead of LAST_NAME - index only access suffices */

EXPLAIN PLAN SET STATEMENT_ID='T6' FOR
SELECT hire_date
  FROM plch_employees
 WHERE hire_date BETWEEN TO_DATE ('01-01-2010', 'MM-DD-YYYY')
                     AND TO_DATE ('12-31-2010', 'MM-DD-YYYY')
/
Explained.

Elapsed: 00:00:00.00

-------------------------------------------------------------------------------------
| Id  | Operation        | Name             | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT |                  |   321K|  2511K|   868   (2)| 00:00:04 |
|*  1 |  INDEX RANGE SCAN| I_PLCH_EMPLOYEES |   321K|  2511K|   868   (2)| 00:00:04 |
-------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("HIRE_DATE"&amp;gt;=TO_DATE(' 2010-01-01 00:00:00', 'syyyy-mm-dd
              hh24:mi:ss') AND "HIRE_DATE"&amp;lt;=TO_DATE(' 2010-12-31 00:00:00', 'syyyy-mm-dd
              hh24:mi:ss'))

15 rows selected.

Elapsed: 00:00:00.00
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-5299984991996182014?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/5299984991996182014/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/12/complex-world-of-indexing-10193.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/5299984991996182014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/5299984991996182014'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/12/complex-world-of-indexing-10193.html' title='The Complex World of Indexing (10193)'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-4601369658951731773</id><published>2011-12-02T15:34:00.000Z</published><updated>2011-12-02T15:34:24.505Z</updated><title type='text'>Looking for a few good...SQL quizzes</title><content type='html'>Friends,&lt;br /&gt;
&lt;br /&gt;
As many of you know, we now offer a weekly SQL quiz, in addition to the daily PL/SQL quizzes.&lt;br /&gt;
&lt;br /&gt;
I have a nice solid backlog of PL/SQL quiz submissions from players - and I must use these very gradually due to their impact on rankings (the author gets maximum score possible for their quiz).&lt;br /&gt;
&lt;br /&gt;
We are in need, though, of SQL quizzes. I can and will write them, but my SQL expertise is not very expert. I'd love to feature the experience and creativity of players from all over the world.&lt;br /&gt;
&lt;br /&gt;
Just click on Submit Quiz and have a go at it. I am happy to help you "polish up" the text, so don't worry about the fine details. Just make sure you provide working verification code, a nice variety of chocies, and a solid explanation from which I can work.&lt;br /&gt;
&lt;br /&gt;
Many thanks in advance,&lt;br /&gt;
Steven Feuerstein&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-4601369658951731773?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/4601369658951731773/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/12/looking-for-few-goodsql-quizzes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/4601369658951731773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/4601369658951731773'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/12/looking-for-few-goodsql-quizzes.html' title='Looking for a few good...SQL quizzes'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-2283107033967461223</id><published>2011-12-02T15:23:00.000Z</published><updated>2011-12-02T15:23:53.480Z</updated><title type='text'>Late Report:: Results of Q3 2011 Championship Playoff</title><content type='html'>[My apologies to players of the championship - I just discovered that I had neglected to publish this post way back in October.]&lt;br /&gt;
&lt;br /&gt;
You will find below the results of the Q3 2011 championship playoff, played on 25 October.    The number next to the player's name is the number of times that  player has been in a playoff. &lt;br /&gt;
&lt;br /&gt;
You can take a look at  the quizzes that were in the competition through   the Library page.  These results will also be available through the  Rankings  page.&lt;br /&gt;
&lt;br /&gt;
Congratulations to all players, of course, but let's give a special round of applause to our top three players:&lt;br /&gt;
&lt;br /&gt;
1. &lt;b&gt;Frank Schrader&lt;/b&gt;,  who has played in an astonishing five playoffs (this is the 6th since  we started the PL/SQL Challenge in April 2010) and wins a US$250  Amazon.com gift card.&lt;br /&gt;
&lt;br /&gt;
2. &lt;b&gt;Kevan Gelling&lt;/b&gt;, who has played in three playoffs (a fine accomplishment in and of itself) and wins a US$175 Amazon.com gift card. &lt;br /&gt;
&lt;br /&gt;
3. &lt;b&gt;Justin Cave&lt;/b&gt;, who has played in four playoffs (very impressive) and wins a US$100 Amazon.com gift card. &lt;br /&gt;
&lt;br /&gt;
&lt;table style="border-collapse: collapse; border: 1px solid blue;"&gt;&lt;tbody&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt; &lt;th style="width: 10%;"&gt;Rank&lt;/th&gt; &lt;th style="width: 30%;"&gt;Name (Playoffs)&lt;/th&gt; &lt;th style="width: 30%;"&gt;Country&lt;/th&gt; &lt;th style="width: 20%;"&gt;Total Time&lt;/th&gt; &lt;th style="width: 10%;"&gt;Total Score&lt;/th&gt; &lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;Frank Schrader (5)&lt;/td&gt;&lt;td&gt;Germany&lt;/td&gt;&lt;td&gt;17 mins 08 secs&lt;/td&gt;&lt;td&gt;3052&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;Kevan Gelling (3)&lt;/td&gt;&lt;td&gt;Isle of Man&lt;/td&gt;&lt;td&gt;19 mins 57 secs&lt;/td&gt;&lt;td&gt;2651&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;Justin Cave (4)&lt;/td&gt;&lt;td&gt;United States&lt;/td&gt;&lt;td&gt;19 mins 59 secs&lt;/td&gt;&lt;td&gt;2635&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;Randy Gettman (4)&lt;/td&gt;&lt;td&gt;United States&lt;/td&gt;&lt;td&gt;17 mins 49 secs&lt;/td&gt;&lt;td&gt;2629&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;_Nikotin (3)&lt;/td&gt;&lt;td&gt;Russia&lt;/td&gt;&lt;td&gt;16 mins 28 secs&lt;/td&gt;&lt;td&gt;2566&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;mentzel.iudith (4)&lt;/td&gt;&lt;td&gt;Israel&lt;/td&gt;&lt;td&gt;19 mins 54 secs&lt;/td&gt;&lt;td&gt;2512&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;Jeff Kemp (6)&lt;/td&gt;&lt;td&gt;Australia&lt;/td&gt;&lt;td&gt;13 mins 25 secs&lt;/td&gt;&lt;td&gt;2342&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;Niels Hecker (5)&lt;/td&gt;&lt;td&gt;Germany&lt;/td&gt;&lt;td&gt;17 mins 09 secs&lt;/td&gt;&lt;td&gt;2267&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;Jerry Bull (2)&lt;/td&gt;&lt;td&gt;United States&lt;/td&gt;&lt;td&gt;19 mins 54 secs&lt;/td&gt;&lt;td&gt;2247&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;Janis Baiza (3)&lt;/td&gt;&lt;td&gt;Latvia&lt;/td&gt;&lt;td&gt;18 mins 45 secs&lt;/td&gt;&lt;td&gt;2235&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;Siim Kask (4)&lt;/td&gt;&lt;td&gt;Estonia&lt;/td&gt;&lt;td&gt;19 mins 27 secs&lt;/td&gt;&lt;td&gt;2201&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;james su (3)&lt;/td&gt;&lt;td&gt;Canada&lt;/td&gt;&lt;td&gt;16 mins 46 secs&lt;/td&gt;&lt;td&gt;2070&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;13&lt;/td&gt;&lt;td&gt;Anton Scheffer (2)&lt;/td&gt;&lt;td&gt;Netherlands&lt;/td&gt;&lt;td&gt;16 mins 04 secs&lt;/td&gt;&lt;td&gt;1974&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;14&lt;/td&gt;&lt;td&gt;Viacheslav Stepanov (3)&lt;/td&gt;&lt;td&gt;Russia&lt;/td&gt;&lt;td&gt;19 mins 32 secs&lt;/td&gt;&lt;td&gt;1954&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;15&lt;/td&gt;&lt;td&gt;Ludovic Szewczyk (2)&lt;/td&gt;&lt;td&gt;Belgium&lt;/td&gt;&lt;td&gt;19 mins 59 secs&lt;/td&gt;&lt;td&gt;1850&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;Joaquin Gonzalez (3)&lt;/td&gt;&lt;td&gt;Spain&lt;/td&gt;&lt;td&gt;16 mins 42 secs&lt;/td&gt;&lt;td&gt;1786&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;17&lt;/td&gt;&lt;td&gt;kowido (3)&lt;/td&gt;&lt;td&gt;No Country Set&lt;/td&gt;&lt;td&gt;19 mins 32 secs&lt;/td&gt;&lt;td&gt;1649&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;18&lt;/td&gt;&lt;td&gt;Ninoslav Čerkez (1)&lt;/td&gt;&lt;td&gt;Croatia&lt;/td&gt;&lt;td&gt;19 mins 22 secs&lt;/td&gt;&lt;td&gt;1638&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;19&lt;/td&gt;&lt;td&gt;Chad Lee (2)&lt;/td&gt;&lt;td&gt;United States&lt;/td&gt;&lt;td&gt;19 mins 56 secs&lt;/td&gt;&lt;td&gt;1596&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;20&lt;/td&gt;&lt;td&gt;Syed Ariful Bari (1)&lt;/td&gt;&lt;td&gt;Bangladesh&lt;/td&gt;&lt;td&gt;05 mins 59 secs&lt;/td&gt;&lt;td&gt;1550&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;21&lt;/td&gt;&lt;td&gt;Anna Onishchuk (3)&lt;/td&gt;&lt;td&gt;Ireland&lt;/td&gt;&lt;td&gt;17 mins 32 secs&lt;/td&gt;&lt;td&gt;1519&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;22&lt;/td&gt;&lt;td&gt;Dmitry Pushkashu (1)&lt;/td&gt;&lt;td&gt;Moldova&lt;/td&gt;&lt;td&gt;16 mins 24 secs&lt;/td&gt;&lt;td&gt;1462&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;23&lt;/td&gt;&lt;td&gt;Michal Cvan (4)&lt;/td&gt;&lt;td&gt;Slovakia&lt;/td&gt;&lt;td&gt;19 mins 41 secs&lt;/td&gt;&lt;td&gt;1426&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;24&lt;/td&gt;&lt;td&gt;Thierry Poels (2)&lt;/td&gt;&lt;td&gt;Belgium&lt;/td&gt;&lt;td&gt;18 mins 32 secs&lt;/td&gt;&lt;td&gt;1394&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;25&lt;/td&gt;&lt;td&gt;Rajesh Venkataramani (2)&lt;/td&gt;&lt;td&gt;India&lt;/td&gt;&lt;td&gt;19 mins 26 secs&lt;/td&gt;&lt;td&gt;1196&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;26&lt;/td&gt;&lt;td&gt;Dejan Topalovic (1)&lt;/td&gt;&lt;td&gt;Austria&lt;/td&gt;&lt;td&gt;14 mins 09 secs&lt;/td&gt;&lt;td&gt;1147&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;27&lt;/td&gt;&lt;td&gt;macabre (2)&lt;/td&gt;&lt;td&gt;Russia&lt;/td&gt;&lt;td&gt;19 mins 47 secs&lt;/td&gt;&lt;td&gt;1099&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;28&lt;/td&gt;&lt;td&gt;Alain Boulianne (1)&lt;/td&gt;&lt;td&gt;French Republic&lt;/td&gt;&lt;td&gt;15 mins 11 secs&lt;/td&gt;&lt;td&gt;1061&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;29&lt;/td&gt;&lt;td&gt;Spoon (2)&lt;/td&gt;&lt;td&gt;Singapore&lt;/td&gt;&lt;td&gt;19 mins 40 secs&lt;/td&gt;&lt;td&gt;957&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;30&lt;/td&gt;&lt;td&gt;dobloman (1)&lt;/td&gt;&lt;td&gt;Netherlands&lt;/td&gt;&lt;td&gt;16 mins 16 secs&lt;/td&gt;&lt;td&gt;700&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;31&lt;/td&gt;&lt;td&gt;John Hall (3)&lt;/td&gt;&lt;td&gt;United States&lt;/td&gt;&lt;td&gt;19 mins 41 secs&lt;/td&gt;&lt;td&gt;481&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-2283107033967461223?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/2283107033967461223/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/12/late-report-results-of-q3-2011.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/2283107033967461223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/2283107033967461223'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/12/late-report-results-of-q3-2011.html' title='Late Report:: Results of Q3 2011 Championship Playoff'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-8412369893205939774</id><published>2011-11-30T17:17:00.003Z</published><updated>2011-11-30T20:09:42.753Z</updated><title type='text'>Nuances of Deterministic Functions in PL/SQL (9588)</title><content type='html'>The 23 November quiz tested your knowledge of the little-known fact that as of Oracle Database 11g, the compiler will optimize the execution of deterministic functions in PL/SQL blocks. Previously, defining a function with the DETERMINISTIC clause led to optimizations when the function was called inside an SQL statement, but not in PL/SQL code itself.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.plsqlchallenge.com/pls/apex/f?p=10000:PROFILE:609832554151448::::P1051_USER_ID:12376"&gt;_Nikotin&lt;/a&gt;, a devoted and high-ranking PL/SQL Challenge player, took the quiz as a launch point for an in-depth analysis of this optimization and came up with several interesting conclusions:&lt;br /&gt;
&lt;br /&gt;
1. The optimization only occurs when the values passed as arguments to the function are &lt;a href="http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/packages.htm#LNPLS804"&gt;compile-time &lt;/a&gt;constants, such as 1 or 'abc' or true or even TO_NUMBER('123') when the optimization level is set to at least 2. If you pass to one of the IN arguments an expression that cannot be determined at compile time to be a constant , no optimization occurs. Makes perfect sense, as this optimization occurs at compile time.&lt;br /&gt;
&lt;br /&gt;
2.The optimization does not seem to occur outside of the context of a loop. In other words, calling the function N times with the same compile-time static arguments explicitly in your code results in the body of the function being executed N times.&lt;br /&gt;
&lt;br /&gt;
3. Furthermore, if the loop contains non-deterministic code (that is, it is not simply calling deterministic functions with compile-time static constants), then the optimization also does not occur.&lt;br /&gt;
&lt;br /&gt;
So at this point, it looks to _Nikotin and I that the applicability of this new optimization will be fairly narrow. Perhaps over time, the PL/SQL team will extend the circumstances under which the optimization will occur.&lt;br /&gt;
&lt;br /&gt;
You will find below some details reinforcing the above points. In addition, I have attached a file to the list of resources for this quiz to demonstrate circumstances of optimization.&lt;br /&gt;
&lt;br /&gt;
Cheers, Steven&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;DBMS_PROFILER Demonstrates No Optimization Outside of Loop (from _Nikotin)&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-left: 40px;"&gt;&lt;span style="font-family: courier new,monospace;"&gt;def proc_name = PLCH_TEST_LOOPS&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;def func_name = PLCH_TEST_DETERM&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;create or replace function &amp;amp;func_name&lt;br /&gt;
(&lt;br /&gt;
&amp;nbsp; i varchar2&lt;br /&gt;
) return varchar2 &lt;br /&gt;
&amp;nbsp; deterministic is&lt;br /&gt;
begin&lt;br /&gt;
&amp;nbsp; return i;&lt;br /&gt;
end;&lt;br /&gt;
/&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;create or replace procedure &amp;amp;proc_name is&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;&amp;nbsp; res varchar2(1);&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;begin&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;&amp;nbsp; res := &amp;amp;func_name('a');&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;&amp;nbsp; res := &amp;amp;func_name('a');&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;&amp;nbsp; res := &amp;amp;func_name('a');&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;&amp;nbsp; res := &amp;amp;func_name('a');&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;&amp;nbsp; res := &amp;amp;func_name('a');&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;&amp;nbsp; res := &amp;amp;func_name('a');&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;&amp;nbsp; res := &amp;amp;func_name('a');&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;&amp;nbsp; res := &amp;amp;func_name('a');&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;&amp;nbsp; res := &amp;amp;func_name('a');&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;&amp;nbsp; res := &amp;amp;func_name('a');&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;end;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;/&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;var res number&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;exec :res := dbms_profiler.start_profiler('&amp;amp;proc_name');&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;exec plch_test_loops;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;exec :res := dbms_profiler.stop_profiler;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;col text format a60&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;set pagesize 100&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;select s.text, d.total_occur&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;from plsql_profiler_data d&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;&amp;nbsp;&amp;nbsp; , user_source s&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;&amp;nbsp;&amp;nbsp; , plsql_profiler_units u&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;where d.runid = &lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select max(runid) runid &lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; from plsql_profiler_runs &lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; where run_comment = '&amp;amp;proc_name'&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; )&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;&amp;nbsp; and d.runid = u.runid&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;&amp;nbsp; and u.unit_name in ('&amp;amp;proc_name', '&amp;amp;func_name')&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;&amp;nbsp; and d.unit_number = u.unit_number&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;&amp;nbsp; and &lt;a href="http://s.name/"&gt;s.name&lt;/a&gt; = u.unit_name&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;&amp;nbsp; and s.line = d.line#&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;order by u.unit_number, d.line#;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
And the results:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-left: 40px;"&gt;&lt;span style="font-family: courier new,monospace;"&gt;TEXT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TOTAL_OCCUR&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;------------------------------------------- -----------&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;procedure PLCH_TEST_LOOPS is&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: #99ff99; font-family: courier new,monospace;"&gt;&amp;nbsp; res := PLCH_TEST_DETERM('a');&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: #99ff99; font-family: courier new,monospace;"&gt;&amp;nbsp; res := PLCH_TEST_DETERM('a');&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: #99ff99; font-family: courier new,monospace;"&gt;&amp;nbsp; res := PLCH_TEST_DETERM('a');&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: #99ff99; font-family: courier new,monospace;"&gt;&amp;nbsp; res := PLCH_TEST_DETERM('a');&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: #99ff99; font-family: courier new,monospace;"&gt;&amp;nbsp; res := PLCH_TEST_DETERM('a');&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: #99ff99; font-family: courier new,monospace;"&gt;&amp;nbsp; res := PLCH_TEST_DETERM('a');&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: #99ff99; font-family: courier new,monospace;"&gt;&amp;nbsp; res := PLCH_TEST_DETERM('a');&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: #99ff99; font-family: courier new,monospace;"&gt;&amp;nbsp; res := PLCH_TEST_DETERM('a');&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: #99ff99; font-family: courier new,monospace;"&gt;&amp;nbsp; res := PLCH_TEST_DETERM('a');&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: #99ff99; font-family: courier new,monospace;"&gt;&amp;nbsp; res := PLCH_TEST_DETERM('a');&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;end;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;function PLCH_TEST_DETERM&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: red; font-family: courier new,monospace;"&gt;&amp;nbsp; return&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;end; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
For &lt;span class="short_text" id="result_box" lang="en"&gt;&lt;span class="hps"&gt;comparison&lt;/span&gt;&lt;/span&gt; with loops:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-left: 40px;"&gt;&lt;span style="font-family: courier new,monospace;"&gt;def proc_name = PLCH_TEST_LOOPS&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;def func_name = PLCH_TEST_DETERM&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;create or replace function &amp;amp;func_name&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;(&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;&amp;nbsp; i varchar2&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;) return varchar2 &lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;&amp;nbsp; deterministic is&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;begin&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;&amp;nbsp; return i;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;end;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;/&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;create or replace procedure &amp;amp;proc_name is&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;&amp;nbsp; res varchar2(1);&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;begin&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;&amp;nbsp; for i in 1 .. 10 loop&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; res := &amp;amp;func_name('a');&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;&amp;nbsp; end loop;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;end;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;/&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;var res number&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;exec :res := dbms_profiler.start_profiler('&amp;amp;proc_name');&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;exec plch_test_loops;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;exec :res := dbms_profiler.stop_profiler;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;col text format a60&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;set pagesize 140&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;select s.text, d.total_occur&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;from plsql_profiler_data d&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;&amp;nbsp;&amp;nbsp; , user_source s&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;&amp;nbsp;&amp;nbsp; , plsql_profiler_units u&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;where d.runid = &lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select max(runid) runid &lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; from plsql_profiler_runs &lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; where run_comment = '&amp;amp;proc_name'&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; )&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;&amp;nbsp; and d.runid = u.runid&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;&amp;nbsp; and u.unit_name in ('&amp;amp;proc_name', '&amp;amp;func_name')&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;&amp;nbsp; and d.unit_number = u.unit_number&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;&amp;nbsp; and &lt;a href="http://s.name/"&gt;s.name&lt;/a&gt; = u.unit_name&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;&amp;nbsp; and s.line = d.line#&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;order by u.unit_number, d.line#;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;And result is:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="font-family: courier new,monospace; margin-left: 40px;"&gt;TEXT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TOTAL_OCCUR&lt;br /&gt;
--------------------------------------- -----------&lt;br /&gt;
&lt;br /&gt;
procedure PLCH_TEST_LOOPS is&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&lt;br /&gt;
&amp;nbsp; for i in 1 .. 10 loop&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 11&lt;br /&gt;
&lt;span style="background-color: #66ff99;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; res := PLCH_TEST_DETERM('a');&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10&lt;/span&gt;&lt;br /&gt;
end;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;br /&gt;
function PLCH_TEST_DETERM&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&lt;br /&gt;
&lt;span style="background-color: red;"&gt;&amp;nbsp; r&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;/span&gt;&lt;br /&gt;
end;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;/div&gt;&lt;br /&gt;
&lt;div class="gmail_quote"&gt;&lt;b&gt;Impact of Non-Deterministic Code Inside Loop&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
The following code uses inserts into a table (via an autonomous transaction) to demonstrate how often the body of the deterministic function is executed. You might think that this logging means the function is &lt;i&gt;not&lt;/i&gt; deterministic and therefore will turn off the optimization, but that is not the case. The PL/SQL compiler does not validate that a function is &lt;i&gt;truly&lt;/i&gt;deterministic; it does not make a decision on whether or not to avoid execution of the function based on the code inside the function. All of that is decided at the time the code is compiled, based solely on the way the function is called - and, in turns out, the other code executed in the loop.&lt;br /&gt;
&lt;pre&gt;CREATE TABLE plch_log (created_on DATE)
/

CREATE OR REPLACE PACKAGE plch_getdata
IS
   PROCEDURE log_count (title_in IN VARCHAR2);

   FUNCTION vc (vc VARCHAR2)
      RETURN VARCHAR2
      DETERMINISTIC;
END;
/

CREATE OR REPLACE PACKAGE BODY plch_getdata
IS
   PROCEDURE log_count (title_in IN VARCHAR2)
   IS
      l_count   PLS_INTEGER;
   BEGIN
      SELECT COUNT (*) INTO l_count FROM plch_log;
      DBMS_OUTPUT.put_line (title_in || '=' || l_count);
   END;

   PROCEDURE log_call
   IS
      PRAGMA AUTONOMOUS_TRANSACTION;
   BEGIN
      INSERT INTO plch_log VALUES (SYSDATE);
      COMMIT;
   END;

   FUNCTION vc (vc VARCHAR2)
      RETURN VARCHAR2 DETERMINISTIC
   IS
   BEGIN
      log_call ();
      RETURN vc;
   END;
END;
/

DECLARE
   vc   VARCHAR2 (100);
BEGIN
   FOR i IN 1 .. 10
   LOOP
      vc := plch_getdata.vc ('abc');
   END LOOP;

   plch_getdata.log_count ('VC 10 iterations in loop');

   FOR i IN 1 .. 10
   LOOP
      vc := plch_getdata.vc ('abc');
      vc := 'abc' || TO_CHAR (SYSDATE);
   END LOOP;

   plch_getdata.log_count (&lt;/pre&gt;&lt;pre&gt;'VC 10 iterations with non-deterministic code in loop');
END;
/

VC 10 iterations in loop=1
VC 10 iterations with non-deterministic code in loop=11

DROP TABLE plch_log
/

DROP PACKAGE plch_getdata
/&lt;/pre&gt;&lt;b&gt;Effect on Inlining Optimization (level 3) - from _Nikotin&lt;br /&gt;
&lt;/b&gt;&lt;br /&gt;
&lt;span class="short_text" id="result_box" lang="en"&gt;&lt;span class="hps"&gt;Because&lt;/span&gt;  &lt;span class="hps"&gt;Oracle&lt;/span&gt; &lt;span class="hps"&gt;can&lt;/span&gt; &lt;span class="hps"&gt;inline&lt;/span&gt;&lt;/span&gt; the local subroutines with plsql_optimize_level =  3, the "non-deterministic" part of the loop can became deterministic:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="font-family: courier new,monospace; margin-left: 40px;"&gt;def proc_name  = PLCH_TEST_LOOPS&lt;br /&gt;
def func_name = PLCH_TEST_DETERM&lt;br /&gt;
&lt;br /&gt;
create or replace  function &amp;amp;func_name&lt;br /&gt;
(&lt;br /&gt;
&amp;nbsp; i varchar2&lt;br /&gt;
) return varchar2 &lt;br /&gt;
&amp;nbsp;  deterministic is&lt;br /&gt;
begin&lt;br /&gt;
&amp;nbsp; return i;&lt;br /&gt;
end;&lt;br /&gt;
/&lt;br /&gt;
&lt;br /&gt;
&lt;span style="background-color: yellow;"&gt;alter session set plsql_optimize_level  = 2;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
create or replace procedure &amp;amp;proc_name is&lt;br /&gt;
&amp;nbsp; res  varchar2(1);&lt;br /&gt;
&amp;nbsp; procedure inline_proc (i number) is&lt;br /&gt;
&amp;nbsp; begin&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;  null;&lt;br /&gt;
&amp;nbsp; end;&lt;br /&gt;
begin&lt;br /&gt;
&amp;nbsp; for i in 1 .. 10 loop&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; res :=  &amp;amp;func_name('A');&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; inline_proc(1);&lt;br /&gt;
&amp;nbsp; end  loop;&lt;br /&gt;
end;&lt;br /&gt;
/&lt;br /&gt;
&lt;br /&gt;
var res number&lt;br /&gt;
exec :res :=  dbms_profiler.start_profiler('&amp;amp;proc_name');&lt;br /&gt;
exec plch_test_loops;&lt;br /&gt;
exec  :res := dbms_profiler.stop_profiler;&lt;br /&gt;
&lt;br /&gt;
col text format a60&lt;br /&gt;
set pagesize  140&lt;br /&gt;
&lt;br /&gt;
select s.text, d.total_occur&lt;br /&gt;
from plsql_profiler_data d&lt;br /&gt;
&amp;nbsp;&amp;nbsp; ,  user_source s&lt;br /&gt;
&amp;nbsp;&amp;nbsp; , plsql_profiler_units u&lt;br /&gt;
where d.runid = &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  (&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select max(runid) runid &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; from plsql_profiler_runs  &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; where run_comment = '&amp;amp;proc_name'&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; )&lt;br /&gt;
&amp;nbsp; and d.runid =  u.runid&lt;br /&gt;
&amp;nbsp; and d.unit_number = u.unit_number&lt;br /&gt;
&amp;nbsp; and &lt;a href="http://s.name/"&gt;s.name&lt;/a&gt; = u.unit_name&lt;br /&gt;
&amp;nbsp; and s.line = d.line#&lt;br /&gt;
order  by u.unit_number, d.line#;&lt;/div&gt;&lt;br /&gt;
And result:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="font-family: courier new,monospace; margin-left: 40px;"&gt;TEXT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  TOTAL_OCCUR&lt;br /&gt;
------------------------------------------------  -----------&lt;br /&gt;
procedure PLCH_TEST_LOOPS  is&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;br /&gt;
&amp;nbsp; procedure inline_proc (i  number) is&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;span style="background-color: yellow;"&gt;&amp;nbsp;  null;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;  for i in 1 .. 10 loop&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; 11&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;  res := PLCH_TEST_DETERM('A'); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;  inline_proc(1);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  10&lt;br /&gt;
end;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  1&lt;br /&gt;
function PLCH_TEST_DETERM&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  0&lt;br /&gt;
&lt;span style="background-color: yellow;"&gt;&amp;nbsp; return  i;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  10&lt;/span&gt;&lt;br /&gt;
end;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  10&lt;br /&gt;
&lt;/div&gt;&lt;div style="font-family: courier new,monospace;"&gt;&lt;span style="font-family: arial,helvetica,sans-serif;"&gt;And if uses:&lt;br /&gt;
&lt;/span&gt; &lt;div style="margin-left: 40px;"&gt;&lt;span style="background-color: yellow;"&gt;alter session set plsql_optimize_level  = 3;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
&lt;span style="font-family: arial,helvetica,sans-serif;"&gt;Then it will&lt;/span&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-left: 40px;"&gt;TEXT&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  TOTAL_OCCUR&lt;br /&gt;
------------------------------------------------  -----------&lt;br /&gt;
procedure PLCH_TEST_LOOPS  is&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&lt;br /&gt;
&amp;nbsp; for i in 1 .. 10  loop&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 11&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; res :=  PLCH_TEST_DETERM('A');&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;  inline_proc(1);&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  10&lt;br /&gt;
end;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  1&lt;br /&gt;
function PLCH_TEST_DETERM&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  0&lt;br /&gt;
&lt;span style="background-color: yellow;"&gt;&amp;nbsp; return  i;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  1&lt;/span&gt;&lt;br /&gt;
end;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  1&lt;/div&gt;&amp;nbsp;&lt;/div&gt;And nothing with &lt;b&gt;inline_proc&lt;/b&gt;.&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-8412369893205939774?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/8412369893205939774/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/11/nuances-of-deterministic-functions-in.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/8412369893205939774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/8412369893205939774'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/11/nuances-of-deterministic-functions-in.html' title='Nuances of Deterministic Functions in PL/SQL (9588)'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-8500350616957132730</id><published>2011-11-23T03:14:00.001Z</published><updated>2011-11-23T03:16:02.387Z</updated><title type='text'>Explanation for Slow Performance of VARCHAR2 Overloading?</title><content type='html'>Valentin Nikotin, a PL/SQL Challenge player, recently brought to my attention some unexpectedly slow performance when executing from within a query an overloaded function that accepts a VARCHAR2 argument, compared to a NUMBER argument. I have been able to reproduce this (see below). I thought I'd see if any readers of this blog had an idea as to what might be the cause.&lt;br /&gt;
&lt;br /&gt;
We both ran this code on an 11.2 instance.&lt;br /&gt;
&lt;pre&gt;CREATE OR REPLACE PACKAGE pkg_test
AS
   FUNCTION fv (i VARCHAR2)
      RETURN NUMBER;

   FUNCTION fn (i NUMBER)
      RETURN NUMBER;
END;
/

CREATE OR REPLACE PACKAGE BODY pkg_test
AS
   FUNCTION fv (i VARCHAR2)
      RETURN NUMBER
   IS
   BEGIN
      RETURN 1;
   END;

   FUNCTION fn (i NUMBER)
      RETURN NUMBER
   IS
   BEGIN
      RETURN 1;
   END;
END;
/

CREATE OR REPLACE FUNCTION fv (i VARCHAR2)
   RETURN NUMBER
IS
BEGIN
   RETURN 1;
END;
/

CREATE OR REPLACE FUNCTION fn (i NUMBER)
   RETURN NUMBER
IS
BEGIN
   RETURN 1;
END;
/

/* No difference in PL/SQL 

"VC2 overloading" completed in: 2.5 seconds
"Number overloading" completed in: 2.52 seconds
"Schema-level VC2" completed in: 2.48 seconds
"Schema-level Number" completed in: 2.49 seconds

*/

DECLARE
   l             NUMBER;
   last_timing   NUMBER := NULL;

   PROCEDURE start_timer
   IS
   BEGIN
      last_timing := DBMS_UTILITY.get_cpu_time;
   END;

   PROCEDURE show_elapsed_time (message_in IN VARCHAR2 := NULL)
   IS
   BEGIN
      DBMS_OUTPUT.put_line (
            '"'
         || message_in
         || '" completed in: '
         || (DBMS_UTILITY.get_cpu_time - last_timing) / 100
         || ' seconds');
   END;
BEGIN
   start_timer;

   FOR indx IN 1 .. 10000000
   LOOP
      l := pkg_test.fv (NULL);
   END LOOP;

   show_elapsed_time ('VC2 overloading');
   --
   start_timer;

   FOR indx IN 1 .. 10000000
   LOOP
      l := pkg_test.fn (NULL);
   END LOOP;

   show_elapsed_time ('Number overloading');
   --
   start_timer;

   FOR indx IN 1 .. 10000000
   LOOP
      l := fv (NULL);
   END LOOP;

   show_elapsed_time ('Schema-level VC2');
   --
   start_timer;

   FOR indx IN 1 .. 10000000
   LOOP
      l := fv (NULL);
   END LOOP;

   show_elapsed_time ('Schema-level Number');
END;
/

/* Noticeable difference in SQL 

MAX(PKG_TEST.FV(NULL))
----------------------
                     1
1 row selected.
Elapsed: 00:00:07.93

MAX(FV(NULL))
-------------
            1
1 row selected.
Elapsed: 00:00:05.03

MAX(PKG_TEST.FN(NULL))
----------------------
                     1
1 row selected.
Elapsed: 00:00:04.45

MAX(FN(NULL))
-------------
            1
1 row selected.
Elapsed: 00:00:05.45

*/

SET TIMING ON

CREATE TABLE driver_table
AS
       SELECT LEVEL id
         FROM DUAL
   CONNECT BY LEVEL &amp;lt; 1000000
/

SELECT MAX (pkg_test.fv (NULL)) FROM driver_table
/

SELECT MAX (fv (NULL)) FROM driver_table
/

SELECT MAX (pkg_test.fn (NULL)) FROM driver_table
/

SELECT MAX (fn (NULL)) FROM driver_table
/

DROP driver_table
/

DROP package pkg_test
/

DROP FUNCTION fn
/

DROP FUNCTION fv
/
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-8500350616957132730?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/8500350616957132730/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/11/explanation-for-slow-performance-of.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/8500350616957132730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/8500350616957132730'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/11/explanation-for-slow-performance-of.html' title='Explanation for Slow Performance of VARCHAR2 Overloading?'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-8576359448295537025</id><published>2011-11-10T16:25:00.000Z</published><updated>2011-11-10T16:25:38.149Z</updated><title type='text'>How Reliable are PL/Scope Results? (9403)</title><content type='html'>The 9 November quiz on PL/Scope asked players to draw conclusions about a package body from the data in the user_identifiers view.&lt;br /&gt;
&lt;br /&gt;
One of our most dedicated players, Iudith Mentzel, spent some time testing out the results one gets from PL/Scope (and queries against user_identifiers) for various uses of labels and GOTOs. I publish her comments below for your consideration.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;From Iudith Mentzel&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
I don't want to object to either the results, which are somewhat "colorful" , or the PL/Scope feature itself, but it looks like the "safe usage" of the feature is at least a little bit "less wider" that one may be (too optimistically) tempted to believe .&lt;br /&gt;
&lt;br /&gt;
While the reasoning behind the answer presented for each choice is completely logical and probably follows the reasoning that the players used, driving categorical conclusions about the code contents by ONLY looking at the data gathered by the PL/SQL Scope feature can sometimes be a little bit dangerous ...&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
The LABEL and GOTO issue seems very clear on a first glance, however, here is a small example of what can happen if we "tweak" the code a little bit:&lt;br /&gt;
&lt;pre&gt;-- amendment to add a GOTO ...
CREATE OR REPLACE PACKAGE BODY plch_pkg
IS
   PROCEDURE do_stuff
   IS
      l_items   DBMS_SQL.number_table;
   BEGIN
      FORALL indx IN 1 .. l_items.COUNT
         UPDATE plch_stuff
            SET amount = l_items (indx);

      GOTO all_done;
      NULL;
      &amp;lt;&amp;lt;all_done&amp;gt;&amp;gt;

      DBMS_OUTPUT.put_line (SYSDATE);      

   END do_stuff;
END plch_pkg;
/

-- there is NO LABEL at all in the result set, though we have a label and a GOTO !!!
SELECT type, usage, name
  FROM user_identifiers 
 WHERE object_name = 'PLCH_PKG'
 ORDER BY 1, 2
/

TYPE               USAGE       NAME
------------------ ----------- ------------------------------
ITERATOR           DECLARATION INDX
ITERATOR           REFERENCE   INDX
PACKAGE            DECLARATION PLCH_PKG
PACKAGE            DEFINITION  PLCH_PKG
PROCEDURE          DECLARATION DO_STUFF
PROCEDURE          DEFINITION  DO_STUFF
SYNONYM            CALL        PLITBLM
SYNONYM            REFERENCE   DBMS_SQL
VARIABLE           DECLARATION L_ITEMS
VARIABLE           REFERENCE   L_ITEMS
VARIABLE           REFERENCE   L_ITEMS

11 rows selected.
&lt;/pre&gt;This is probably because the PL/SQL Optimizing compiler has removed the "non-effective" stuff ...but if we replace the NULL with some other stuff:&lt;br /&gt;
&lt;pre&gt;CREATE OR REPLACE PACKAGE BODY plch_pkg
IS
   PROCEDURE do_stuff
   IS
      l_items   DBMS_SQL.number_table;
   BEGIN
      FORALL indx IN 1 .. l_items.COUNT
         UPDATE plch_stuff
            SET amount = l_items (indx);

      GOTO all_done;
      DBMS_OUTPUT.put_line('Some stuff');
      &amp;lt;&amp;lt;all_done&amp;gt;&amp;gt;

      DBMS_OUTPUT.put_line (SYSDATE);      

   END do_stuff;
END plch_pkg;
/
&lt;/pre&gt;then the LABEL is back, though the code still performs exactly the same as before!&lt;br /&gt;
&lt;pre&gt;SELECT type, usage, name
  FROM user_identifiers 
 WHERE object_name = 'PLCH_PKG'
 ORDER BY 1, 2
/

TYPE            USAGE       NAME
--------------- ----------- --------------------
FUNCTION        CALL        SYSDATE
ITERATOR        DECLARATION INDX
ITERATOR        REFERENCE   INDX
LABEL           DECLARATION ALL_DONE
LABEL           REFERENCE   ALL_DONE
PACKAGE         DECLARATION PLCH_PKG
PACKAGE         DEFINITION  PLCH_PKG
PROCEDURE       DECLARATION DO_STUFF
PROCEDURE       DEFINITION  DO_STUFF
SYNONYM         CALL        PLITBLM
SYNONYM         REFERENCE   DBMS_OUTPUT
SYNONYM         REFERENCE   DBMS_SQL
SYNONYM         REFERENCE   DBMS_OUTPUT
VARIABLE        DECLARATION L_ITEMS
VARIABLE        REFERENCE   L_ITEMS
VARIABLE        REFERENCE   L_ITEMS

16 rows selected.
&lt;/pre&gt;Now I add one more label....&lt;br /&gt;
&lt;pre&gt;CREATE OR REPLACE PACKAGE BODY plch_pkg
IS
   PROCEDURE do_stuff
   IS
      l_items   DBMS_SQL.number_table;
   BEGIN
      FORALL indx IN 1 .. l_items.COUNT
         UPDATE plch_stuff
            SET amount = l_items (indx);

      GOTO all_done;
      NULL;
      &amp;lt;&amp;lt;all_done&amp;gt;&amp;gt;

      DBMS_OUTPUT.put_line (SYSDATE);      

      &amp;lt;&amp;lt;another_label&amp;gt;&amp;gt;
      DBMS_OUTPUT.put_line (SYSDATE);
   END do_stuff;
END plch_pkg;
/
&lt;/pre&gt;And still no LABEL seen in the output, though we have two labels and one GOTO ...&lt;br /&gt;
&lt;pre&gt;SELECT type, usage, name
  FROM user_identifiers 
 WHERE object_name = 'PLCH_PKG'
 ORDER BY 1, 2
/

TYPE            USAGE       NAME
--------------- ----------- --------------------
ITERATOR        DECLARATION INDX
ITERATOR        REFERENCE   INDX
PACKAGE         DECLARATION PLCH_PKG
PACKAGE         DEFINITION  PLCH_PKG
PROCEDURE       DECLARATION DO_STUFF
PROCEDURE       DEFINITION  DO_STUFF
SYNONYM         CALL        PLITBLM
SYNONYM         REFERENCE   DBMS_SQL
VARIABLE        DECLARATION L_ITEMS
VARIABLE        REFERENCE   L_ITEMS
VARIABLE        REFERENCE   L_ITEMS

11 rows selected.
&lt;/pre&gt;However, it all depends on &lt;i&gt;where&lt;/i&gt; the label is located, for example:&lt;br /&gt;
&lt;pre&gt;-- adding still another label, but at the beginning 
CREATE OR REPLACE PACKAGE BODY plch_pkg
IS
   PROCEDURE do_stuff
   IS
      l_items   DBMS_SQL.number_table;
   BEGIN
      &amp;lt;&amp;lt;still_another_label&amp;gt;&amp;gt;
      FORALL indx IN 1 .. l_items.COUNT
         UPDATE plch_stuff
            SET amount = l_items (indx);

      GOTO all_done;
      NULL;
      &amp;lt;&amp;lt;all_done&amp;gt;&amp;gt;

      DBMS_OUTPUT.put_line (SYSDATE);      

      &amp;lt;&amp;lt;another_label&amp;gt;&amp;gt;
      DBMS_OUTPUT.put_line (SYSDATE);
   END do_stuff;
END plch_pkg;
/

-- now the first label only appears ...
SELECT type, usage, name
  FROM user_identifiers 
 WHERE object_name = 'PLCH_PKG'
 ORDER BY 1, 2
/

TYPE               USAGE       NAME
------------------ ----------- ------------------------------
ITERATOR           DECLARATION INDX
ITERATOR           REFERENCE   INDX
LABEL              DECLARATION STILL_ANOTHER_LABEL
PACKAGE            DECLARATION PLCH_PKG
PACKAGE            DEFINITION  PLCH_PKG
PROCEDURE          DECLARATION DO_STUFF
PROCEDURE          DEFINITION  DO_STUFF
SYNONYM            CALL        PLITBLM
SYNONYM            REFERENCE   DBMS_SQL
VARIABLE           DECLARATION L_ITEMS
VARIABLE           REFERENCE   L_ITEMS
VARIABLE           REFERENCE   L_ITEMS

12 rows selected.
&lt;/pre&gt;Now we have two labels, but still only one LABEL declaration, though they are both  "equally uneffective"  ...&lt;/another_label&gt;&lt;/all_done&gt;&lt;/still_another_label&gt;&lt;/another_label&gt;&lt;/all_done&gt;&lt;/all_done&gt;&lt;br /&gt;
&lt;br /&gt;
Below I have two labels, one the target of a GOTO, but still no label appears in the user_identifiers view:&lt;br /&gt;
&lt;pre&gt;CREATE OR REPLACE PACKAGE BODY plch_pkg
IS
   PROCEDURE do_stuff
   IS
      l_items   DBMS_SQL.number_table;
   BEGIN
      FORALL indx IN 1 .. l_items.COUNT
         UPDATE plch_stuff
            SET amount = l_items (indx);

      GOTO another_label;
      NULL;
      &amp;lt;&amp;lt;all_done&amp;gt;&amp;gt;

      DBMS_OUTPUT.put_line (SYSDATE);      

      &amp;lt;&amp;lt;another_label&amp;gt;&amp;gt;
      DBMS_OUTPUT.put_line (SYSDATE);
   END do_stuff;
END plch_pkg;
/

-- still no label, though here logic does matter !
SELECT type, usage, name
  FROM user_identifiers 
 WHERE object_name = 'PLCH_PKG'
 ORDER BY 1, 2
/

TYPE            USAGE       NAME
--------------- ----------- --------------------
ITERATOR        DECLARATION INDX
ITERATOR        REFERENCE   INDX
PACKAGE         DECLARATION PLCH_PKG
PACKAGE         DEFINITION  PLCH_PKG
PROCEDURE       DECLARATION DO_STUFF
PROCEDURE       DEFINITION  DO_STUFF
SYNONYM         CALL        PLITBLM
SYNONYM         REFERENCE   DBMS_SQL
VARIABLE        DECLARATION L_ITEMS
VARIABLE        REFERENCE   L_ITEMS
VARIABLE        REFERENCE   L_ITEMS

11 rows selected.
&lt;/PRE&gt;The label was effective, but still NOT shown in user_identifiers. The CALL to SYSDATE also NOT shown !!! The reference to DBMS_OUTPUT synonym also NOT shown !!!&lt;br /&gt;
&lt;br /&gt;
I just wanted to emphasize how volatile it is to drive conclusions about source code based ONLY on the results in USER_IDENTIFIERS ... &lt;br /&gt;
&lt;br /&gt;
These results seem to be generated AFTER the compiler optimizes the source code so, at least in some aspects, they may be misleading ...&lt;br /&gt;
&lt;br /&gt;
Regarding the choice that asked about FORALL, though the reasoning behind it seems correct, equally to you and to us, in an after-thought it also can be argued ...and this because using FORALL requires a collection to be used, and that would probably introduce additional data into the USER_IDENTIFIERS result set, whether it is a DBMS_SQL based collection, one based on a locally defined TYPE or even on a type referenced from some other package ...&lt;br /&gt;
&lt;br /&gt;
The output for the sample package shown in the Verification code looks like this:&lt;br /&gt;
&lt;pre&gt;CREATE OR REPLACE PACKAGE BODY plch_pkg
IS
   PROCEDURE do_stuff
   IS
      l_items   DBMS_SQL.number_table;
   BEGIN
      FORALL indx IN 1 .. l_items.COUNT
         UPDATE plch_stuff
            SET amount = l_items (indx);

      &amp;lt;&amp;lt;all_done&amp;gt;&amp;gt;
      DBMS_OUTPUT.put_line (SYSDATE);
   END do_stuff;
END plch_pkg;
/

-- we see some SYNONYMS in the output, that were not there in the original quiz
SELECT type, usage, name
  FROM user_identifiers 
 WHERE object_name = 'PLCH_PKG'
 ORDER BY 1, 2
/

TYPE               USAGE       NAME
------------------ ----------- ------------------------------
FUNCTION           CALL        SYSDATE
ITERATOR           DECLARATION INDX
ITERATOR           REFERENCE   INDX
LABEL              DECLARATION ALL_DONE
PACKAGE            DECLARATION PLCH_PKG
PACKAGE            DEFINITION  PLCH_PKG
PROCEDURE          DECLARATION DO_STUFF
PROCEDURE          DEFINITION  DO_STUFF
SYNONYM            CALL        PLITBLM
SYNONYM            REFERENCE   DBMS_OUTPUT
SYNONYM            REFERENCE   DBMS_SQL
VARIABLE           DECLARATION L_ITEMS
VARIABLE           REFERENCE   L_ITEMS
VARIABLE           REFERENCE   L_ITEMS

14 rows selected.
&lt;/pre&gt;A last remark is about deciding whether a variable is defined at the package level or inside a subprogram: I think this can be done (maybe preferably) by checking whether the "parent" (the context owner) of the variable declaration is the PACKAGE, rather than a subprogram, for example:&lt;br /&gt;
&lt;pre&gt;--check variable context ownership
CREATE OR REPLACE PACKAGE BODY plch_pkg
IS
   g_variable   NUMBER ;

   PROCEDURE do_stuff
   IS
      l_items   DBMS_SQL.number_table;
   BEGIN
      FORALL indx IN 1 .. l_items.COUNT
         UPDATE plch_stuff
            SET amount = l_items (indx);

      &amp;lt;&amp;lt;all_done&amp;gt;&amp;gt;
      DBMS_OUTPUT.put_line (SYSDATE);
   END do_stuff;
END plch_pkg;
/

COLUMN TYPE FORMAT A15
COLUMN NAME FORMAT A20

SELECT var.type, var.usage, var.name, parent.type, parent.usage, parent.name
  FROM user_identifiers  var,
       user_identifiers  parent
 WHERE var.object_name = 'PLCH_PKG'
   AND var.type        = 'VARIABLE'
   AND var.usage       = 'DECLARATION'
   AND parent.object_name = var.object_name
   AND parent.object_type = var.object_type
   AND parent.usage_id    = var.usage_context_id
 ORDER BY 1, 2
/

TYPE            USAGE       NAME                 TYPE            USAGE       NAME
--------------- ----------- -------------------- --------------- ----------- ----------------
VARIABLE        DECLARATION L_ITEMS              PROCEDURE       DEFINITION  DO_STUFF
VARIABLE        DECLARATION G_VARIABLE           PACKAGE         DEFINITION  PLCH_PKG

2 rows selected.
&lt;/pre&gt;In summary, looking only at the data in USER_IDENTIFIERS, we cannot derive 100% precise (YES/NO) conclusions regarding ALL aspects the code ... Just a few thoughts regarding a tough quiz ... and, as I see, not just for me ...For some reason, it reminds me of the one related to "implicit conversions" in the previous  quarter ...&lt;br /&gt;
&lt;br /&gt;
Best Regards,&lt;br /&gt;
Iudith&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-8576359448295537025?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/8576359448295537025/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/11/how-reliable-are-plscope-results-9403.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/8576359448295537025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/8576359448295537025'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/11/how-reliable-are-plscope-results-9403.html' title='How Reliable are PL/Scope Results? (9403)'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-7336732761850464896</id><published>2011-11-09T13:43:00.000Z</published><updated>2011-11-09T13:43:15.096Z</updated><title type='text'>Can Choice Be Correct If Error Raised? (9401)</title><content type='html'>The 7 November quiz tested your knowledge of the fact that this statement:&lt;br /&gt;
&lt;pre&gt;DROP PACKAGE
&lt;/pre&gt;will drop both the package specification and body.&lt;br /&gt;
&lt;br /&gt;
Several players complained that we marked this choice as correct :&lt;br /&gt;
&lt;pre&gt;DROP PACKAGE plch_pkg
/

DROP PACKAGE BODY plch_pkg
/&lt;/pre&gt;As one person wrote:&lt;span style="color: blue;"&gt; "If you drop the a package and then try to drop the package body, you get the error ORA-04043: object PLCH_PKG does not exist. Answer 8571 is NOT correct."&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
One person even went so as to say: &lt;span style="color: blue;"&gt;"I really don't like to have the solution DROP PACKAGE plch_pkg / DROP PACKAGE BODY plch_pkg / scored as correct. Yes the correct outcome is shown, BUT it is definitely bad style. And knowing that an error will pop up made me not choosing this answer, so I'm blamed again for good style. I know that you will not rescore the answer. But this kind of scoring makes me think to withdraw from the PL/SQL Challenge. So please harden your choices to support good style as well."&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
I must admit to being a little taken aback by these responses. Let's first address the "correctness" issue and then move on to what we should and should not &lt;i&gt;include&lt;/i&gt; as correct choices in future quizzes.&lt;br /&gt;
&lt;br /&gt;
This choice was marked correct because we asked this:&lt;br /&gt;
&lt;br /&gt;
Which of the choices will result in the following two lines being displayed? &lt;span style="color: blue;"&gt;[after calling a stored procedure that shows the status of the specified database object]&lt;/span&gt;&lt;br /&gt;
&lt;pre&gt;PACKAGE PLCH_PKG: UNDEFINED
PACKAGE BODY PLCH_PKG: UNDEFINED&lt;/pre&gt;It is, without doubt, true that if you run the two DROP statements above (a) those two lines of text will be displayed (so I don't see why a rescoring should be done), as both spec and body are gone, and (b) the second statement will result in Oracle throwing this error:&lt;br /&gt;
&lt;pre&gt;ORA-04043: object &lt;i&gt;string&lt;/i&gt; does not exist
    Cause: An object name was specified that was not recognized by the system.
&lt;/pre&gt;Now, as noted above, the text will be displayed as required, so I do not think that any changes to the scoring should be performed.&lt;br /&gt;
&lt;br /&gt;
But should I not include such choices in the quiz? And if I do, should I always mark them as incorrect because they are "bad code"?&lt;br /&gt;
&lt;br /&gt;
Certainly, it needs to be very clear that the second statement is unnecessary and &lt;i&gt;will&lt;/i&gt; throw the error. More generally, we should provide strong recommendations against using a certain approach if it is problematic in some way.&lt;br /&gt;
&lt;br /&gt;
But never include choices like this marked as "correct"? I just don't see why we would exclude such things. There is usually some sort of lesson to be learned, some way to help you reflect on the way you do your work, and the kinds of traps you can fall into.&lt;br /&gt;
&lt;br /&gt;
In this case,&amp;nbsp; for example, I could see a developer who wasn't clear on the concept that DROP PACKAGE drops the body put such statements in their clean-up scripts. They might never have noticed that errors were being raised, because the end result met their requirements: packages all gone.&lt;br /&gt;
&lt;br /&gt;
So they would in this case have marked that choice as correct, but then learned from reading the explanation that it is not necessary and should therefore be removed. Lesson learned.&lt;br /&gt;
&lt;br /&gt;
What are your thoughts?&lt;br /&gt;
&lt;br /&gt;
Cheers,&lt;br /&gt;
&lt;a href="http://www.flickr.com/photos/stevenfeuerstein/sets/72157627937199329/"&gt;Grandpa Steven&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-7336732761850464896?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/7336732761850464896/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/11/can-choice-be-correct-if-error-raised.html#comment-form' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/7336732761850464896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/7336732761850464896'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/11/can-choice-be-correct-if-error-raised.html' title='Can Choice Be Correct If Error Raised? (9401)'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-8016067499459356139</id><published>2011-11-03T19:28:00.001Z</published><updated>2011-11-03T19:29:10.423Z</updated><title type='text'>Explorations into Pipelined Functions (9398)</title><content type='html'>The 2 November quiz on pipelined table functions and autonomous transactions prompted the following submission from Chad Lee of Telligen, specifically the 2nd and 3rd points in the explanation:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;(1) A pipelined table function returns a row to its invoker (a query) with the PIPE ROW statement and then continues to process rows.&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="color: blue;"&gt;(2) Pipelined functions can help improve response time because the entire collection need not be constructed and returned to the server before the query can work with and return a single result row.&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="color: blue;"&gt;(3) In addition, the function consumes less Process Global Area memory, because the object cache need not materialize the entire collection.&lt;/div&gt;&lt;br /&gt;
I post his comments below for all to consider and discuss:&lt;br /&gt;
&lt;br /&gt;
If one modifies the plch_pipeline package body by adding "dbms_lock.sleep(2);" just before the update statement to introduce a 2 second delay between returning rows from the pipelined function, and creates the following get_sysdate function to return the current sysdate accurate to the second, one can see that the pipelined function does indeed return rows to the calling query in 2 second intervals, as seen in the output.  This result does not directly counter (2) or (3).&lt;br /&gt;
&lt;br /&gt;
However, the results of the query are returned all at once, rather than one row every two seconds (think all_rows vs first_rows), which seems to indicate there is some buffering/materializing of the rows due to the autonomous transaction / pipelined function before control is passed fully to the calling SQL statement.  If the calling SQL statement was completely free to work with the individual rows returned from the pipelined autonomous transaction (the different get_sysdate value seems to indicate partial control at the calling SQL), wouldn't the rows have been returned to the SQL Plus prompt in 2 second intervals similar to the first_rows hint?  This behavior would seem to counter (2) and (3).&lt;br /&gt;
&lt;br /&gt;
If I put the query in a loop in a PL/SQL block, I can see that the loop does not execute until all rows from the pipelined function have been returned.  Thus, the rows returned by the pipelined function are being buffered somewhere.  Would this not be in the PGA?  In effect, isn't the entire collection being materialized before control is returned to the calling program?  Does this counter (2) and (3), as the loop does not work with the first row when it is returned, but instead waits for all rows to be materialized before starting execution of the loop?&lt;br /&gt;
&lt;br /&gt;
This behavior reinforces my understanding of Autonomous Transactions, such that although operating outside of the calling transaction, the autonomous transaction must complete fully before control is passed back to the calling transaction.  Thus, any data returned by a pipelined function used within an autonomous transaction must in fact be materialized fully before control is passed back to the calling transaction.  Whether this occurs one row at a time with a back and forth interaction between the calling transaction and the autonomous transaction or when all rows are computed by the autonomous transaction, a continually growing memory structure would be created.  The manner in which the rows are returned would also seem to impact performance, with the back and forth action you describe seemingly slower than returning all at once.&lt;br /&gt;
&lt;br /&gt;
A more in depth example could be created to determine where the pipelined rows are being materialized before the calling transaction continues execution.&lt;br /&gt;
&lt;pre&gt;CREATE OR REPLACE PACKAGE BODY plch_pipeline
IS
   FUNCTION double_values (dataset refcur_t)
      RETURN numbers_t PIPELINED
   IS
      PRAGMA AUTONOMOUS_TRANSACTION;
      l_number   NUMBER;
   BEGIN
      LOOP
         FETCH dataset INTO l_number;
         EXIT WHEN dataset%NOTFOUND;

         dbms_lock.sleep(2);      -- add sleep of 2 seconds

         UPDATE plch_parts SET partnum = partnum;
         COMMIT;
         
         PIPE ROW (l_number * 2);
      END LOOP;
      CLOSE dataset;
      RETURN;
   END;
END plch_pipeline;
/

-- generate the current sysdate to the second
create or replace function get_sysdate
return varchar2
is
  ls_date       varchar2(20);
begin
  select to_char(sysdate,'mm/dd/yyyy hh24:mi:ss') 
    into ls_date from dual;
  return ls_date;
end;
/

col get_sysdate format a20
SELECT a.column_value, rownum, get_sysdate
  FROM TABLE (plch_pipeline.double_values (
                CURSOR (SELECT line
                          FROM user_source
                         WHERE name = 'PLCH_PIPELINE'
                           AND type = 'PACKAGE'
                           AND line &amp;lt;= 3
                         ORDER BY line))) a
/
&lt;/pre&gt;Can verify rows are being returned by the autonomous transaction at 2 second intervals.  However, the results are all returned at the same time to the SQL Plus prompt and not as they receive their get_sysdate value. &lt;br /&gt;
&lt;pre&gt;COLUMN_VALUE     ROWNUM GET_SYSDATE
------------ ---------- --------------------
           2          1 11/03/2011 10:33:10
           4          2 11/03/2011 10:33:12
           6          3 11/03/2011 10:33:14

begin
  for rec in (SELECT a.column_value, rownum, get_sysdate date_val
    FROM TABLE (plch_pipeline.double_values (
                CURSOR (SELECT line
                          FROM user_source
                         WHERE name = 'PLCH_PIPELINE'
                           AND type = 'PACKAGE'
                           AND line &amp;lt;= 3
                         ORDER BY line))) a) loop
  
    dbms_lock.sleep(1);
    dbms_output.put_line(
         rec.column_value || ', ' || rec.rownum || ', ' || 
         rec.date_val || ', ' || 
         to_char(sysdate,'mm/dd/yyyy hh24:mi:ss'));
  end loop;
end;
/
&lt;/pre&gt;The timestamp generated/printed within the loop has a value after the timestamp generated from the pipelined function, showing that the data from the pipelined autonomous transaction function is being materialized prior to the loop starting execution. */ &lt;br /&gt;
&lt;pre&gt;2, 1, 11/03/2011 11:21:31, 11/03/2011 11:21:36
4, 2, 11/03/2011 11:21:33, 11/03/2011 11:21:37
6, 3, 11/03/2011 11:21:35, 11/03/2011 11:21:38
&lt;/pre&gt;In addition, if I modify the get_sysdate function to introduce a delay of 3 seconds, one can see from the output that there is a delay of 5 seconds between each row returned from the pipelined function (2 seconds within the pipelined function and 3 seconds from the get_sysdate call), indicating that the entire operation is running in a strictly serial manner.  (1 - get value from pipeline function, 2 - make call to get_sysdate for the row in the calling query, repeat these two steps for each of the three rows returned by the pipeline function) &lt;br /&gt;
&lt;pre&gt;create or replace function get_sysdate
return varchar2
is
  ls_date       varchar2(20);
begin
  dbms_lock.sleep(3);
  select to_char(sysdate,'mm/dd/yyyy hh24:mi:ss') 
    into ls_date from dual;
  return ls_date;
end;
/

SELECT a.column_value, rownum, get_sysdate
  FROM TABLE (plch_pipeline.double_values (
                CURSOR (SELECT line
                          FROM user_source
                         WHERE name = 'PLCH_PIPELINE'
                           AND type = 'PACKAGE'
                           AND line &amp;lt;= 3
                         ORDER BY line))) a
/


COLUMN_VALUE     ROWNUM GET_SYSDATE
------------ ---------- --------------------
           2          1 11/03/2011 13:47:54
           4          2 11/03/2011 13:47:59
           6          3 11/03/2011 13:48:04

&lt;/pre&gt;The same serial behavior is seen in the pl/sql block, with all rows from the pipeline function materialized in a serial manner before executing the cursor loop.&lt;br /&gt;
&lt;pre&gt;begin
  for rec in (SELECT a.column_value, rownum, get_sysdate date_val
    FROM TABLE (plch_pipeline.double_values (
                CURSOR (SELECT line
                          FROM user_source
                         WHERE name = 'PLCH_PIPELINE'
                           AND type = 'PACKAGE'
                           AND line &amp;lt;= 3
                         ORDER BY line))) a) loop
  
    dbms_lock.sleep(1);
    dbms_output.put_line(
        rec.column_value || ', ' || rec.rownum || ', ' ||
        rec.date_val || ', ' || 
        to_char(sysdate,'mm/dd/yyyy hh24:mi:ss'));
  end loop;
end;
/

2, 1, 11/03/2011 13:51:45, 11/03/2011 13:51:56
4, 2, 11/03/2011 13:51:50, 11/03/2011 13:51:57
6, 3, 11/03/2011 13:51:55, 11/03/2011 13:51:58
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-8016067499459356139?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/8016067499459356139/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/11/explorations-into-pipelined-functions.html#comment-form' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/8016067499459356139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/8016067499459356139'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/11/explorations-into-pipelined-functions.html' title='Explorations into Pipelined Functions (9398)'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-4222082474256860788</id><published>2011-11-02T16:13:00.000Z</published><updated>2011-11-02T16:13:09.906Z</updated><title type='text'>"Average" function not correct due to lack of rounding? (9397)</title><content type='html'>The 1 November quiz tested your knowledge of the ability to select from a nested table using the TABLE operator and, in this case, apply the AVG function to the contents of the collection. The question asked in the quiz was:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: blue;"&gt;Which of the choices implements a function named plch_avg that  calculates the average of all elements in a collection of the above type&lt;/span&gt;&lt;b style="color: blue;"&gt; &lt;/b&gt;&lt;span style="color: blue;"&gt; so that the following block displays "3.5" after execution&lt;/span&gt;&lt;span style="color: blue;"&gt;?&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
We compared the TABLE operator approach to algorithms one might write themselves to compute the average. One of these, marked as correct, is:&lt;br /&gt;
&lt;pre&gt;CREATE OR REPLACE FUNCTION plch_avg (numbers_in IN plch_numbers_t)
   RETURN NUMBER
IS
   l_index   PLS_INTEGER := numbers_in.FIRST;
   l_average     NUMBER := 0;
BEGIN
   WHILE l_index IS NOT NULL
   LOOP
      l_average := l_average + numbers_in (l_index)/numbers_in.count;
      l_index := numbers_in.NEXT (l_index);
   END LOOP;

   RETURN l_average;
END;
&lt;/pre&gt;Several players objected and believe that this choice should be marked as incorrect, since it will not always produce the expected result. For example, if I pass a nested table of 9 rows (values 1 through 9), this function returns:&lt;br /&gt;
&lt;pre&gt;5.00000000000000000000000000000000000001
&lt;/pre&gt;This is certainly true, and if we asked you to identify algorithms that would work under all circumstances, we would be wrong to mark this as correct. We would also be wrong to mark choice 8476 as correct, since an empty collection would cause the function to fail with a divide-by-zero exception.&lt;br /&gt;
&lt;br /&gt;
But we asked you to identify choices &lt;span style="color: blue;"&gt;so that the following block displays "3.5"&lt;/span&gt;. It certainly does that, and so we believe that this choice &lt;i&gt;should&lt;/i&gt; be scored as correct.&lt;br /&gt;
&lt;br /&gt;
Your thoughts?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-4222082474256860788?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/4222082474256860788/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/11/average-function-not-correct-due-to_02.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/4222082474256860788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/4222082474256860788'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/11/average-function-not-correct-due-to_02.html' title='&quot;Average&quot; function not correct due to lack of rounding? (9397)'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-7009027935578994450</id><published>2011-10-28T16:55:00.000+01:00</published><updated>2011-10-28T16:55:31.178+01:00</updated><title type='text'>Wanted: Your Ideas for Key PL/SQL Enhancements</title><content type='html'>On November 9, I will be doing the keynote presentation at the 100th member  meeting of the&amp;nbsp;&lt;a href="http://nocoug.org/next.html"&gt;Northern California  OUG&lt;/a&gt;. The day &lt;i&gt;before &lt;/i&gt;that I will visit with the PL/SQL development team at  Oracle HQ.&lt;br /&gt;
&lt;br /&gt;
It's always great to catch up not just with Bryn Llewellyn, the  PL/SQL Product Manager, but also some of the developers themselves (those very  special human beings who actually build the programming language at the center  of so many of our lives). They'll interrogate me to get a sense of what  developers are doing (and not doing) with PL/SQL out there in the "real world."  And I'll find out whatever I can about new features in the upcoming release of  the language (in this case, 12.1).&lt;br /&gt;
&lt;br /&gt;
I usually take advantage of this wonderful opportunity to also tell them about what I'd love  to see added to (or fixed in) PL/SQL. Of course, my ideas are limited to my own  experience. So I thought I would ask all of you for your ideas.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;What changes in  PL/SQL would make the biggest difference for you and your applications?&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
You can  reply to this newsletter/blog with your thoughts. You can also visit  &lt;a href="http://iloveplsqland.net/"&gt;ILovePLSQLAnd.net&lt;/a&gt; to vote on a set of enhancement ideas, and even submit your  own for consideration.&lt;br /&gt;
&lt;br /&gt;
I'll pull together all the ideas I receive and  present them to the PL/SQL team. But I must warn you: I&amp;nbsp;don't expect&amp;nbsp;to come out  of this meeting with a list of confirmed enhancements planned for future  PL/SQLs. That simply isn't the way Oracle plays the game. Instead, you'll just  have to hold your breath until some future version of Oracle Database delivers  the enhancement you requested.&lt;br /&gt;
&lt;br /&gt;
Thanks in advance for your input!&lt;br /&gt;
Steven&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-7009027935578994450?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/7009027935578994450/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/10/wanted-your-ideas-for-key-plsql.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/7009027935578994450'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/7009027935578994450'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/10/wanted-your-ideas-for-key-plsql.html' title='Wanted: Your Ideas for Key PL/SQL Enhancements'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-4747557860675704392</id><published>2011-10-14T12:54:00.000+01:00</published><updated>2011-10-14T12:54:29.761+01:00</updated><title type='text'>No Error Log Table, So No Choices Correct? (7990)</title><content type='html'>The 13 October quiz tested your knowledge of the DBMS_ERRLOG package and what happens when you try to create an error logging table for a table that has unsupported column types, such as CLOB.&lt;br /&gt;
&lt;br /&gt;
Several players wrote with objections along this line:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;I disagree with your answer to this quiz. You say that ORA-00942... propagates  unhandled from the block. While this is true, I still selected 'none of the  answers are true' because before this error shows, you get the following error  when you attempt to execute the create_error_log statement: 'ORA-20069:  unsupported column type(s) found: CLOB_VALUE....' so in my opinion, none of the answers are correct.&lt;/div&gt;&lt;br /&gt;
The question stated "I execute the following statements:" and indeed the execution of this block:&lt;br /&gt;
&lt;pre&gt;BEGIN
   DBMS_ERRLOG.create_error_log (dml_table_name =&amp;gt; 'PLCH_EMPLOYEES');
END;
/&lt;/pre&gt;will result in ORA-20069 being raised. But we never stated that each of these statements ran without error, only that we ran them.&lt;br /&gt;
&lt;br /&gt;
Then, because the error logging table was not created, the attempt to use LOG ERRORS with the DML statement causes ORA-00942 (table or view does not exist) to be raised.&lt;br /&gt;
&lt;br /&gt;
My main objective with this quiz was to make you aware that you could get a very puzzling error (table or view does not exist) from a DML statement against a table that clearly &lt;i&gt;does&lt;/i&gt; exist. It is not in any way obvious that the error has to do with the fact that the underlying, unnamed error logging table does not exist.&lt;br /&gt;
&lt;br /&gt;
But if you agree that "this is true" - that (to repeat the choice we scored as correct):&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;The following exception propagates unhandled from the block:&lt;/div&gt;&lt;pre style="color: blue;"&gt;ORA-00942: table or view does not exist&lt;/pre&gt;Then I do not see how you can also argue that no choices are correct.&lt;br /&gt;
&lt;br /&gt;
Your thoughts?&lt;br /&gt;
&lt;br /&gt;
Cheers, Steven Feuerstein&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-4747557860675704392?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/4747557860675704392/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/10/no-error-log-table-so-no-choices.html#comment-form' title='17 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/4747557860675704392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/4747557860675704392'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/10/no-error-log-table-so-no-choices.html' title='No Error Log Table, So No Choices Correct? (7990)'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-8095597524999785449</id><published>2011-10-13T15:12:00.000+01:00</published><updated>2011-10-13T15:12:46.963+01:00</updated><title type='text'>Chinese Translations of PL/SQL Challenge Quizzes</title><content type='html'>James Su, a PL/SQL Challenge player, recently asked for permission to translate quizzes and post them on a site for Oracle developers working in the Chinese language.&lt;br /&gt;
&lt;br /&gt;
I was, of course, delighted to give him this permission.&lt;br /&gt;
&lt;br /&gt;
You can now check out his work at:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.itpub.net/thread-1499223-1-1.html"&gt;http://www.itpub.net/thread-1499223-1-1.html&amp;nbsp;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
If anyone else is interested in translating quizzes, you have my permission in advance - as long as you agree to include links to the PL/SQL Challenge website, so that we can get other people playing the quizzes in "real time."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-8095597524999785449?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/8095597524999785449/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/10/chinese-translations-of-plsql-challenge.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/8095597524999785449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/8095597524999785449'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/10/chinese-translations-of-plsql-challenge.html' title='Chinese Translations of PL/SQL Challenge Quizzes'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-7792733696472537372</id><published>2011-10-12T01:15:00.000+01:00</published><updated>2011-10-12T01:15:06.684+01:00</updated><title type='text'>Typo in Question Text Requires Score Adjustment (7988)</title><content type='html'>For the first 11 or so hours of 11 October 2011, we asked players to pick a block of code that would display this string:&lt;br /&gt;
&lt;pre&gt;1*October*2011*12:01:01&lt;/pre&gt;As a number of players noted, none of the choices would do the trick - and they wondered if we'd made a mistake. Yes, indeed, that was a typo. So at 6:15 AM Chicago time, Steven woke up, checked his email and was immediately at all the bug reports.&lt;br /&gt;
&lt;br /&gt;
Then he changed the question text to:&lt;br /&gt;
&lt;pre&gt;1*October*2011*12*01*01&lt;/pre&gt;so that the several hundred other Oracle technologists who would be playing the quiz on the 11th would have a more interesting experience.&lt;br /&gt;
&lt;br /&gt;
As a result of these actions, we will issue a correction to the 189 players who chose "Not correct" for the fourth choice (which &lt;i&gt;should&lt;/i&gt; have been correct).&lt;br /&gt;
&lt;br /&gt;
It is, of course, frustrating to everyone when we make mistakes like this, and I (yes, this is me, Steven, talking earlier in the third person) apologize to all. But when I am done apologizing, I like to think about how mistakes like this can happen.&lt;br /&gt;
&lt;br /&gt;
You see, I was especially frustrated this morning because at about 03:00 on the 11th (10 PM Chicago time), I received an email from Jeffrey Kemp, one of the most diligent and expert of our players who also happens to live in Perth and so he plays very early in the day (UTC-timewise). He reported this problem. So I took a look. I looked at the question text. I ran the code for the "correct choice"...&lt;br /&gt;
&lt;br /&gt;
And it looked just fine to me! And so another 8 hours passed, and hundreds of other answers submitted, before I took a closer look and recognized/accepted my error.&lt;br /&gt;
&lt;br /&gt;
How could this be? Because we humans have a tendency to see what we &lt;i&gt;want&lt;/i&gt; or &lt;i&gt;expect&lt;/i&gt; to see, rather than what is really there. This "quick and dirty" approach to life can be helpful at times, but when it comes to analyzing and debugging code, it is a downright nasty tendency.&lt;br /&gt;
&lt;br /&gt;
Professional proofreaders scan text backwards so that they will not be able to &lt;i&gt;read&lt;/i&gt; the text and thereby make all sorts of assumptions, and skip over problems in the text. We programmers can't read our code backwards, so we have to make an extra effort to force ourselves to really look at, really read, what we've written, and make sure it makes sense.&lt;br /&gt;
&lt;br /&gt;
That's what I am going to do from now on. Promise.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-7792733696472537372?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/7792733696472537372/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/10/typo-in-question-text-requires-score.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/7792733696472537372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/7792733696472537372'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/10/typo-in-question-text-requires-score.html' title='Typo in Question Text Requires Score Adjustment (7988)'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-3069911834418913731</id><published>2011-10-11T13:29:00.000+01:00</published><updated>2011-10-11T13:29:01.444+01:00</updated><title type='text'>Empty String as Index Value in Collection (7987)</title><content type='html'>The 10 October 2011 quiz tested your knowledge of the effect of a NULL value being passed to the EXISTS method. Iudith Mentzel did some further analysis and offers up these insights:&lt;br /&gt;
&lt;br /&gt;
First, as probably expected, we cannot use NULL as an array index value, neither for an associative array indexed by PLS_INTEGER nor for one indexed by a VARCHAR2, they both raise VALUE_ERROR:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;DECLARE&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; my_list&amp;nbsp;&amp;nbsp; DBMS_SQL.number_table;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;BEGIN&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; my_list(NULL) := 100;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF my_list.EXISTS(NULL) THEN&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DBMS_OUTPUT.PUT_LINE('NULL index exists !');&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ELSE&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DBMS_OUTPUT.PUT_LINE('NULL index does not exist !');&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; END IF;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;END;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;/&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;DECLARE&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;*&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ERROR at line 1:&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ORA-06502: PL/SQL: numeric or value error: NULL index table key value&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ORA-06512: at line 4&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;DECLARE&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; TYPE array_t IS TABLE OF NUMBER INDEX BY VARCHAR2(5);&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; my_list&amp;nbsp;&amp;nbsp; array_t;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;BEGIN&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; my_list(NULL) := 100;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF my_list.EXISTS(NULL) THEN&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DBMS_OUTPUT.PUT_LINE('NULL index exists !');&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ELSE&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DBMS_OUTPUT.PUT_LINE('NULL index does not exist !');&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; END IF;&lt;/span&gt; &lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;END;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;/&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;DECLARE&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;*&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ERROR at line 1:&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ORA-06502: PL/SQL: numeric or value error: NULL index table key value&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;ORA-06512: at line 5&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
However, for a VARCHAR2 index we can use an empty string ( '' ) as an index without error, and it is NOT the same as a NULL index:&lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;DECLARE&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; TYPE array_t IS TABLE OF NUMBER INDEX BY VARCHAR2(5);&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; my_list&amp;nbsp;&amp;nbsp; array_t;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;BEGIN&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; my_list('') := 100;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF my_list.EXISTS(NULL) THEN&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DBMS_OUTPUT.PUT_LINE('NULL index exists !');&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ELSE&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DBMS_OUTPUT.PUT_LINE('NULL index does not exist !');&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; END IF;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF my_list.EXISTS('') THEN&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DBMS_OUTPUT.PUT_LINE(' '''' index exists !');&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ELSE&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DBMS_OUTPUT.PUT_LINE(' '''' index does not exist !');&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; END IF;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;END;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;/&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;NULL index does not exist !&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;'' index exists !&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
This is in spite of the fact that a VARCHAR2 variable having an empty string assigned to it is considered as NULL (which, as we know, is NOT the case for a CHAR variable):&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;DECLARE&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; my_var&amp;nbsp;&amp;nbsp; VARCHAR2(5) := '' ;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;BEGIN&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF my_var IS NULL THEN &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DBMS_OUTPUT.PUT_LINE('my_var IS NULL');&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ELSE&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DBMS_OUTPUT.PUT_LINE('my_var IS NOT NULL');&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; END IF;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;END;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;/&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;my_var IS NULL&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Strange NULL oddities ...&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
Without this quiz, no one has probably ever thought of trying to use a NULL or a NULL variable as an array index, just to see what happens ...it is entirely the merit of PL/SQL Challenge to make us dig that deeply :-)&amp;nbsp;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-3069911834418913731?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/3069911834418913731/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/10/empty-string-as-index-value-in.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/3069911834418913731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/3069911834418913731'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/10/empty-string-as-index-value-in.html' title='Empty String as Index Value in Collection (7987)'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-4274249673317416003</id><published>2011-10-10T19:15:00.000+01:00</published><updated>2011-10-10T19:15:04.258+01:00</updated><title type='text'>Start and End Dates of the Oracle Magazine Quizzes</title><content type='html'>We've received some feedback players expressing confusion over the start and end dates for the Oracle Magazine quizzes and, related to that, when you can see the answers to the quizzes.&lt;br /&gt;
&lt;br /&gt;
Each issue of Oracle Magazine is available in both online and print edition. Generally, the online edition is available one month prior to the print version, or at least prior to the published months for the issue.&lt;br /&gt;
&lt;br /&gt;
In other words, the Sept/Oct 2011 edition of Oracle Magazine can be seen online starting August 1.&lt;br /&gt;
&lt;br /&gt;
So each Oracle Magazine quiz starts one month earlier than the published starting month, and it overlaps (is still open) the quiz for the next edition. This means that:&lt;br /&gt;
&lt;br /&gt;
1. Two Oracle Magazine quizzes are open at any given point in time.&lt;br /&gt;
&lt;br /&gt;
2. You can't see the answers for the quiz for the previous edition even though the quiz for the next/current edition is available for answering.&lt;br /&gt;
&lt;br /&gt;
Cheers,&lt;br /&gt;
Steven Feuerstein&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-4274249673317416003?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/4274249673317416003/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/10/start-and-end-dates-of-oracle-magazine.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/4274249673317416003'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/4274249673317416003'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/10/start-and-end-dates-of-oracle-magazine.html' title='Start and End Dates of the Oracle Magazine Quizzes'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-1607125768932008082</id><published>2011-10-08T15:51:00.001+01:00</published><updated>2011-10-08T15:51:34.912+01:00</updated><title type='text'>Problems with Links to Oracle Documentation</title><content type='html'>We have recently spent a fair amount of time linking up questions to the appropriate content in the Oracle documentation set.&lt;br /&gt;
&lt;br /&gt;
Now it looks like Oracle has changed the URLs of every single book in the 11.2 documentation set. Which means that virtually every single one of our links are broken.&lt;br /&gt;
&lt;br /&gt;
We are investigating what happened and if there is any chance these links can be restored. In the meantime, our apology for the broken links.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-1607125768932008082?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/1607125768932008082/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/10/problems-with-links-to-oracle.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/1607125768932008082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/1607125768932008082'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/10/problems-with-links-to-oracle.html' title='Problems with Links to Oracle Documentation'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-1143753399664602949</id><published>2011-10-07T22:25:00.001+01:00</published><updated>2011-10-07T22:26:16.747+01:00</updated><title type='text'>Practice Makes Expert: New Feature Ready for Testing!</title><content type='html'>We are implementing the next set of features for the PL/SQL Challenge and are now ready to invite you to try out the first major enhancement: &lt;b&gt;Practice Makes Expert&lt;/b&gt;. Currently, you can take a quiz when it is first offered as part of a competition (daily quiz, weekly quiz, etc.). But we haven't given you any way to take the quiz if you missed its original appearance or if you want to take it &lt;i&gt;again&lt;/i&gt; to see if your understanding of the feature has improved.&lt;br /&gt;
&lt;br /&gt;
You can now do that with &lt;b&gt;Practice Makes Expert&lt;/b&gt;. To try out the Quiz Practices feature, visit &lt;a href="http://test.plsqlchallenge.com/"&gt;test.plsqlchallenge.com&lt;/a&gt;, log in using the same email and password you would use on the production site, and then click on "Practice Makes Expert" button in our "Help Us Test" section:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-ttLXxSm-Hq8/To9sh56w5wI/AAAAAAAAAH4/hQAAQfwOcB8/s1600/helpustest.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="116" src="http://4.bp.blogspot.com/-ttLXxSm-Hq8/To9sh56w5wI/AAAAAAAAAH4/hQAAQfwOcB8/s320/helpustest.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
You will then be taken to a page that explains this feature and gives you an idea of the way it will be implemented on the site. We suggest you read through this page, but after that, you can just click on the Practice menu button to go directly to the Practice Makes Expert Home page, shown below:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-qZ0RJhqY-20/To9rxSaaswI/AAAAAAAAAH0/QJSakPfSb_c/s1600/practicehome.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="302" src="http://3.bp.blogspot.com/-qZ0RJhqY-20/To9rxSaaswI/AAAAAAAAAH0/QJSakPfSb_c/s400/practicehome.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;You can take the practice quiz on the practice home page or from the Play a Quiz table, by clicking on the new Practice tab:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-QtaSUUCVeVM/To9txouUgII/AAAAAAAAAH8/MMfi9hrx3NA/s1600/paq_practice.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="130" src="http://3.bp.blogspot.com/-QtaSUUCVeVM/To9txouUgII/AAAAAAAAAH8/MMfi9hrx3NA/s400/paq_practice.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Rather than explain further about how it this feature works, I'd like to let the website "speak for itself." If you have trouble figuring out what to do, let us know so we can clean up the workflow and/or explanations.&lt;br /&gt;
&lt;br /&gt;
Note: &lt;b&gt;Practice Makes Expert&lt;/b&gt; is also the first of a set of upcoming members-only features. We plan to institute an annual membership fee for those who want to support the PL/SQL Challenge project and get even more out of the site. One of the benefits of membership is unlimited practices, and in particular the Autotune practice feature, which automatically sets up practices for you based on criteria you specify.&lt;br /&gt;
&lt;br /&gt;
Other changes at test.plsqlchallenge.com:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;b&gt;Menu Changes&lt;/b&gt;: We've moved the links to Feedback, FAQ and Blog off the menu and up to the top right corner as hyperlinks. This frees up space on our menu bar for things like Practice.&amp;nbsp; &lt;/li&gt;
&lt;li&gt;&lt;b&gt;Submit Quiz Changes&lt;/b&gt;: on the current site, to submit quiz you have to fill out a very long page of fields and sometimes what you enter is lost due to a variety of issues. Now you can use a wizard to submit a quiz. You can enter and submit the minimal amount of information in just a minute or two. You can then continue on to other pages or come back later to finish up your quiz.&lt;/li&gt;
&lt;/ol&gt;We very much want to know what you think of these new features and changes. Feel free to post your feedback here or by clicking on the Feedback link.&lt;br /&gt;
&lt;br /&gt;
Many thanks in advance for your help!&lt;br /&gt;
Steven Feuerstein&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-1143753399664602949?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/1143753399664602949/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/10/practice-makes-expert-new-feature-ready.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/1143753399664602949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/1143753399664602949'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/10/practice-makes-expert-new-feature-ready.html' title='Practice Makes Expert: New Feature Ready for Testing!'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-ttLXxSm-Hq8/To9sh56w5wI/AAAAAAAAAH4/hQAAQfwOcB8/s72-c/helpustest.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-4380147096894848190</id><published>2011-10-05T02:17:00.003+01:00</published><updated>2011-10-05T21:14:41.331+01:00</updated><title type='text'>Participants in Q3 2011 Championship Playoff</title><content type='html'>30 September ended the third quarter of 2011, which means....it's time to hold a championship playoff!&lt;br /&gt;
&lt;br /&gt;
Participants come in three "flavors":&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Top 25: You ranked in the top 25 for the quarter.&lt;/li&gt;
&lt;li&gt;Correctness: Randomly selected from all players whose % correct is at least as high as the lowest % correct of the top 25 and who played at least 45 quizzes in the quarter.&lt;/li&gt;
&lt;li&gt;Wildcard: Randomly selected from all players who played at least 30 quizzes  in the quarter and whose 30 highest weighted scores meets or exceeds those of the top 25 players.&lt;/li&gt;
&lt;/ol&gt;Visit the &lt;a href="http://www.plsqlchallenge.com/pls/apex/f?p=10000:FAQ"&gt;FAQ&lt;/a&gt; for more details on playoff participant selection.&lt;br /&gt;
&lt;br /&gt;
Below you will find the Q3 2011 participants. Every person on this list devoted a substantial amount of time and brain cells to make it this far. Now they will compete head to head in a time-limited, five-quiz competition to determine the sharpest, most knowledge PL/SQL developers this quarter. &lt;br /&gt;
&lt;br /&gt;
The number in parentheses after their name indicates the number of playoffs in which these players have participated. &lt;b&gt;Congratulations to Jeff Kemp, who has competed in every quarterly playoff since the PL/SQL Challenge started. &lt;/b&gt;And kudos to the many other players who are competing for their 3rd, 4th and 5th times!&lt;br /&gt;
&lt;br /&gt;
We will announce the date for the playoff soon.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&lt;table style="border-collapse: collapse; border: 1px solid blue;"&gt;&lt;tbody&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt; &lt;th style="width: 30%;"&gt;Name&lt;/th&gt; &lt;th style="width: 10%;"&gt;Rank&lt;/th&gt; &lt;th style="width: 20%;"&gt;Qualification&lt;/th&gt; &lt;th style="width: 30%;"&gt;Country&lt;/th&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Frank Schrader (5)&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;Germany&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Syed Ariful Bari (1)&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;Bangladesh&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Dennis Klemme (5)&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;Germany&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Dmitry Pushkashu (1)&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;Moldova&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;mentzel.iudith (4)&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;Israel&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Viacheslav Stepanov (3)&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;Russia&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Joaquin Gonzalez (3)&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;Spain&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Justin Cave (4)&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;United States&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Randy Gettman (4)&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;United States&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;_Nikotin (3)&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;Russia&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Michal Cvan (4)&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;Slovakia&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Rajesh Venkataramani (2)&lt;/td&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;India&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Janis Baiza (3)&lt;/td&gt;&lt;td&gt;13&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;Latvia&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Siim Kask (4)&lt;/td&gt;&lt;td&gt;14&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;Estonia&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;John Hall (3)&lt;/td&gt;&lt;td&gt;15&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;United States&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Niels Hecker (5)&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;Germany&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Jerry Bull (2)&lt;/td&gt;&lt;td&gt;17&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;United States&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Spoon (2)&lt;/td&gt;&lt;td&gt;18&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;Singapore&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;kowido (3)&lt;/td&gt;&lt;td&gt;19&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;No Country Set&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Jeff Kemp (6)&lt;/td&gt;&lt;td&gt;20&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;Australia&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Thierry Poels (2)&lt;/td&gt;&lt;td&gt;21&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;Belgium&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Ludovic Szewczyk (2)&lt;/td&gt;&lt;td&gt;22&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;Belgium&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Chad Lee (2)&lt;/td&gt;&lt;td&gt;23&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;United States&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;james su (3)&lt;/td&gt;&lt;td&gt;24&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;Canada&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Ninoslav Čerkez (1)&lt;/td&gt;&lt;td&gt;25&lt;/td&gt;&lt;td&gt;Top 25&lt;/td&gt;&lt;td&gt;Croatia&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Anton Scheffer (2)&lt;/td&gt;&lt;td&gt;30&lt;/td&gt;&lt;td&gt;Correctness&lt;/td&gt;&lt;td&gt;Netherlands&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Anna Onishchuk (3)&lt;/td&gt;&lt;td&gt;31&lt;/td&gt;&lt;td&gt;Correctness&lt;/td&gt;&lt;td&gt;Ireland&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Yuan Tschang (1)&lt;/td&gt;&lt;td&gt;36&lt;/td&gt;&lt;td&gt;Correctness&lt;/td&gt;&lt;td&gt;United States&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;ZoltanKekes (1)&lt;/td&gt;&lt;td&gt;40&lt;/td&gt;&lt;td&gt;Correctness&lt;/td&gt;&lt;td&gt;United States&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Dejan Topalovic (1)&lt;/td&gt;&lt;td&gt;43&lt;/td&gt;&lt;td&gt;Wildcard&lt;/td&gt;&lt;td&gt;Austria&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Carlos Eduardo Mayorga Rodriguez (1)&lt;/td&gt;&lt;td&gt;44&lt;/td&gt;&lt;td&gt;Wildcard&lt;/td&gt;&lt;td&gt;Colombia&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;sbramhe (2)&lt;/td&gt;&lt;td&gt;65&lt;/td&gt;&lt;td&gt;Wildcard&lt;/td&gt;&lt;td&gt;No Country Set&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Alain Boulianne (1)&lt;/td&gt;&lt;td&gt;66&lt;/td&gt;&lt;td&gt;Wildcard&lt;/td&gt;&lt;td&gt;French Republic&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Jack Callaham (1)&lt;/td&gt;&lt;td&gt;67&lt;/td&gt;&lt;td&gt;Correctness&lt;/td&gt;&lt;td&gt;United States&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;macabre (2)&lt;/td&gt;&lt;td&gt;70&lt;/td&gt;&lt;td&gt;Correctness&lt;/td&gt;&lt;td&gt;Russia&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Kevan Gelling (3)&lt;/td&gt;&lt;td&gt;132&lt;/td&gt;&lt;td&gt;Correctness&lt;/td&gt;&lt;td&gt;Isle of Man&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Michael S. (1)&lt;/td&gt;&lt;td&gt;169&lt;/td&gt;&lt;td&gt;Correctness&lt;/td&gt;&lt;td&gt;Germany&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;dobloman (1)&lt;/td&gt;&lt;td&gt;192&lt;/td&gt;&lt;td&gt;Correctness&lt;/td&gt;&lt;td&gt;Netherlands&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;Ashvin Dadhania (1)&lt;/td&gt;&lt;td&gt;302&lt;/td&gt;&lt;td&gt;Correctness&lt;/td&gt;&lt;td&gt;United States&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-4380147096894848190?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/4380147096894848190/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/10/participants-in-q3-2011-championship.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/4380147096894848190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/4380147096894848190'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/10/participants-in-q3-2011-championship.html' title='Participants in Q3 2011 Championship Playoff'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-611185205138452793</id><published>2011-10-04T05:12:00.001+01:00</published><updated>2011-10-04T05:17:37.330+01:00</updated><title type='text'>Different parameters for UTL_FILE.FCOPY in 10g and 11g? (7982)</title><content type='html'>The 3 October quiz focused on ways to use UTL_FILE package to copy the contents of one file to another file.&lt;br /&gt;
Two players wrote with a concern about a possible conflict between the stated minimum version of this quiz (10.2)&amp;nbsp; and the parameter list in the calls to UTL_FILE.FCOPY. Here's one of the comments:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;There is an issue with today's quiz on fcopy. The minimum version stated is  10.2, however the formal parameters referred to for utl_file.fcopy are those in  11 - which have changed since. The first four formal parameters have been  renamed.&lt;/div&gt;&lt;br /&gt;
Both of the players indicated that they had ignored what they saw as a problem, and answered it "based on what I think the intention was."&lt;br /&gt;
&lt;br /&gt;
Good move, players! Because in fact there is no difference between the parameter lists of FCOPY in 10.2 and 11.2. The only difference is in the documentation.&lt;br /&gt;
&lt;br /&gt;
In the &lt;a href="http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/u_file.htm#sthref11807"&gt;10.2 doc&lt;/a&gt;, FCOPY is described as:&lt;br /&gt;
&lt;pre&gt;UTL_FILE.FCOPY (
   location   IN VARCHAR2,
   filename   IN VARCHAR2,
   dest_dir   IN VARCHAR2,
   dest_file  IN VARCHAR2,
   start_line IN PLS_INTEGER DEFAULT 1,
   end_line   IN PLS_INTEGER DEFAULT NULL);
&lt;/pre&gt;While in the &lt;a href="http://download.oracle.com/docs/cd/E11882_01/appdev.112/e23448/u_file.htm#ARPLS70911"&gt;11.2 doc&lt;/a&gt;, FCOPY is documented as having the following parameter list:&lt;br /&gt;
&lt;pre&gt;UTL_FILE.FCOPY (
   src_location    IN VARCHAR2,
   src_filename    IN VARCHAR2,
   dest_location   IN VARCHAR2,
   dest_filename   IN VARCHAR2,
   start_line      IN BINARY_INTEGER DEFAULT 1,
   end_line        IN BINARY_INTEGER DEFAULT NULL);
&lt;/pre&gt;But if you actually look at the UTL_FILE package specification in a 10.2 installation (which you can find in the ORACLE_HOME/Rdbms/Admin/utlfile.sql file), you will see that in fact even "way" back in 10.2, the parameter names matched those in 11.2.&lt;br /&gt;
&lt;br /&gt;
Which just proves once again that you are always better off actually checking the code compiled into the database than relying on the (any) documentation!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-611185205138452793?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/611185205138452793/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/10/different-parameters-for-utlfilefcopy.html#comment-form' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/611185205138452793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/611185205138452793'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/10/different-parameters-for-utlfilefcopy.html' title='Different parameters for UTL_FILE.FCOPY in 10g and 11g? (7982)'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-3826812634028360195</id><published>2011-10-01T12:59:00.000+01:00</published><updated>2011-10-01T12:59:39.746+01:00</updated><title type='text'>October SQL Quizzes by Tim Hall, ORACLE-BASE.com!</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALgAAAAjCAIAAACo8FcQAAANJ0lEQVR4nO1cr7OrvBb95JXH9k+oxCKvRCJjkUgkNhJZia2srIysjUQiYyMreWKFxSYJ9N6ZN/e+983JdJgeSLJ/ZO21d4Cef5bv9t1+of3ztxX4bv8f7RAo3vlpmp1z3nnvvH+//6Ra3+1/rWWAMk2ztdYYY62VX6y1fn5N0xygM7+8839e4+/2V9oGFOecFQ34MGvD98fzaR/jo67c19V9XX1R+KJwdeX61j9G/3z5+eWf3r/t8k1A/662AQU84ZybphmkItv9frd6fNSV+bq44st9Xd3Xj+1LOP7wReHLn7786R/jX7Tqu/3X245R0Pz7zSNwAxbxRQEiccWX+/phisuGkoCYcMkXhX+M36Tyb2qCUd5vfJxzy7KAXUAzt2FwdRWooij4CfgovtzX1RSXAJGicF/Xb0b5l7UMo0TU4py7DQNyygYXfiRu1qrFlz/985WV551HIkOz1sqKGFfThgo6nSpNkef1NUQbY3C01i7Lgs3dslbxqehokmmaUdRnVf2oydHArI1ZWScGTtMM6x7P5+P5NMbAS5j5VzT388vnUoFkFJtiBXC5DYMERwYuCWiyQLHW9l1/G0dYcr/fb+PYd70xBmbgKjrgiC+3YdBa34ZBLpvWmp1Dt3HUesiukJ9fWg/sHIYMQ9O2OrRBa0257IlR0gSc4ScagqPWA4yK2uP5lGrsBsLGcaT+eVnDTh/ZjDF912Nmuhd+67ueoo90xpembbNYlEDJkAoZxamrhIj8M5OVyp/pahETgDwa/gQ+Hs/nbRiMaAwLjuq6YIZzrmlb7MLkEK11aqcxpmlbSIMHpXRjzG0ci+slkojvj+ez73q50qmS0RETpkBBEqfcdKC1Fl5CPGDlTNL6ro/c650HOq210kDob63VWqtGcbZU9Kb5MHwCivN5RnH+NgymuEiIRJ9wUgJl3jEK3A0bEDfEO+zRergNA7C/hrLGGXy0HjA88qPWYQicgoFSNGgMVyUJYSyDL5DZsM3Wdz1EyyV3zmEtgWz2wdjbMHRdSzCl7rbWso8UutqoMfY2DMuyTNNMlUBRABnQJqcFGcNv/IJ56F6cSa3jB2EMtJ0BZcmVKVuNEiEj4pJ99nF1FZlB9/VdTwwhfXZdC6d3XYtlgHlaD0iu0AHLDJthCQptay2ope96AKJXDWoO9CHV910vSweM7VXDdcWEcCiOR3UGcd91LTXE8KZtMTYLFMjFakEKB0obMe2yRi+XHL7CR+oGKqUPKcjPLzhHa43ig3KRo/lxznVdS1o6A8oRozjn7ve7KS5HpUmaelxdyb0xleu7fvIZ10NFQATLhiG0GQ30gyNPSicGU+8jInIJaT6MejyfqWjwCjPawjLiuBRYVpaCRUuAowbVyeg8Gh6IbRgilbzzqlGP57Npd+sdaou1oiLoORBQgJkRuGGLqhU8H+qeYbiNo3+jdNNaa+ccpEhXyPaZUaZpvt/vplAn9axT1932RzCKcw4EC/bLOg4BCvu3BDEM8gETwoV9ODkiGAvDeWC5nDn1IGfA0vIqyf9I22VZjDFQBqGPHIqlIlZOno6BGOgQkAowjUlUo1JZACKdGZXY1AdkRpxh+WhLcO+qIfIgZmO9n3XUjlGstcYYP7/i1DOO2dLkcJ+sWmlDr5pogaMGHyFJs4iBzaCWrmtDTh1Hmbxk58l7xAf6wDX0S1S4yIa7R/xzc+Upo2BhEOJN2zLTRxOisGVhhJOsD1SjYNpm4FpGUBbDBiaQPFSjuKLOOeqM7Rv4Nc0jSFLY3fRdD80Ju5ObCztGQdWt9cAqDxvr2ziymP2MlX0la61VjYKdUYW7LdX8QqB0Xdisrq4ZaD+5l5QOwkcxizgASxMZ3nkZQEcuiBpIKEpwm6rOL+s2aqthRUEaEQmQBH2UKnGSoOd2Vx7BN/SMqtVtHFWjuN1TqpTBwJ5N20Ye03roVSN3vNxCb15dt9DnbtkBhWUKdllcrb7rxxQofKwTVbKqlcAMQBlHucZRC/dXhm2NceQdDtisVClnACeDbxjTqlEYrhrl5xcSFiY5dwQbh6S+g1bgXUgEE6xxqbWOgdJ1LZaqaVtVh4QCIGodag78ubOiVgABF17VKrgifA/GRrcr1/sxAR99198fg9aDqhWiFFxIzcE6EJG9z8b2oUbB3bq+61WtelWOxcUUlwCRHFAefWutlUXoNM10x0mNgmhgMsa+n+4AjGC5XLYVXoF71i8DOnOzA7iduUE0ZHqwmjzv5xc0wU4VNNm0LYqSkIDGETOgJsWo9KYq5seCOed4txTTEkMkCZLrFjnrVhyR499vmWKwcNhIq1qxEFlWLsQs0zRDDbhxWRZQVzaeM0DBLW1+AU5fd+OcQ8btVfOoq7G4hBp2Bc2jrmzunjfoFJGXXsWWkkG8gkZrrRmda/AFrPj32ztfVhXtxLHv+n5QDBTEJQYe2U+3ymIWUiJGIeK11sYYhHXTtsuy+LcFZyBIcEmp0r+XbJgCuyjDl2XXZ5pmYKVpW9UoWo2aYzVNM/bgDVUrpcqmbdMK+vF8IuRUo/w70DBxg9sTzE1lVcFvqc4xUIBuPhQAVlA2AzQ4iZs/fdc/6uqhro+6cqpFsZ0+LLDWgjkRkRHfrOShlSpRotMjkle3bo2CPuHPWkVPKxCXwKVEUte1qW7ojLDDGWAL4Y4z8D5ikXdraFHkUD+/6O6j2pCFZEqxyNSg8OJ6gTjkO9lAZlxjSky3CyAJAIXWYU5pndBcfwAKX0aRdCKBAoiwQwQaoCSALHEQ1hXegd64t4Og6bue+UXVip4CvQNY2An3qlGNKququF4wFraReLGBLKsqTKvKsqrKqqJoVL6gZcgFhjBPr5qyqnrV4AwwhPICIQuJSpVBSVWqWkFVeYT+0X0g3rcoqwprjHnCZx0OPYvrhVgEDuROSjVKqRL6S0hheNgtjiNNhgkAU2TdJr1Wqg5G5YECJg/Lv2cUnIHUXT4SfMP7pwB75B02QBWrAr0RE1h71BNYUeYpOIK1Ali9rCrYgxVdkRfyFF3DSeBHrDH7B4CKMhN9mMIgPcprWNryx4WUEPJd10dqYyXSJzIMiUiQHAiUENzhpCpDnnIesJAD0R+OpXtVo3rVCJRoYB2ZK7JOWlRWVbp8/6xgf5MPUFjJLwAK0CO7SQYCUNDniHKRVmBDWLBagYHBT7vQxBdVyjLNGAOnYGnZn2AiJ8lAB+Ex/jbpTYh+1F470U3CE7UCTIPchEXioypTRrnf75xqN0nCRqn08ODivaSyArAQBnXwKj3MzPVBZ+HzPFCiPU7UJFAIBckrgVTm1zTNBkyTu0+Phgdd0AYLLMtbbMv5wQPVtKpAKpSPPeUTHPngF7eC5KWwDKoELcmx0cD0s4r+0I1PYlPzocORoGCv85P3TOipH5Duo1HgcpQvyFbITcYYcC12Rudqv+5BXB4oxAoCi3YSKwAKd3GScqAcsILOYJ0sSvCYSlIRWWpZU7iso/nSv5yBorcOQmKUPamef78jFpST8GosOintsd3l2OwoknG65ZFBFfU/EYEzrFFSBWRUS46XBtL5UWbI6pAHCt9kw5bhvr7JwojE/a6IZghhiRKALAuUoJn30gbn3OS3HxChAwsmnt+AImojP7+M8/INrmV9XU16SjJfdF7+yQcXmA16bpDy22vn0ViX7AD4PeuEcNWHN02zA+P19jsbo2csUN6IZ7oyJLjnwCSUm9d5NTMPlEVseQBes77gI16+2gGFza1YAQPd7wb7o6hMcUlblszz6mjn5ZyTNwakYdKV0e/T0sWLljY8wV/LMq4EQXzS8ERJLslhz5y7pVCX4EPqI4HromjZT5JOuKyPGiKV/B5MWZ2PNM+8MyupDKRyW9/NSbMS2cWub8KuCXVHu1LXbJDBBnqBf8pufHMCk0ej5JGXgCE6KLVfKnByJtJB/lAhO2Gqf9YbR1fliuIMLtFAWscORxIjf350xdE8+2c9aw5ygl2ImPv6XipTEosSduBzxMjvXOOsfpHf0zUIKdZ5vNi7TSsUjtrJbOdNLsORH+XkYZSw7qNEhnv2VQTqT6fFpq2ukFI+LL/oGWEl+g656STxT0oZLk4UO8TElpIEwUzizW9yjKzjZLgfNen3aIGDy/Brkj0Dx0dmcf7o5P32bysv/UpzgqVS56QKH/151ORvYo5ErDrY1Ea+xvDRKClF0NJ2uyG6dKL28Y/U14WRdVzEMXzNYtvCza80UCInHoizUZ9okuitkchIhgW/RHulE9GxJus7iNmrWWScBOLGTxHKQ520sYLsIxZ104cswhrrxK7NDwJ2FE2tlj2YTtrnf3uxVQb7u7fyKPgwP8NnKfTIntVTY9JAz0JQxl921KkysXMzfcRLQ9HA7GxLFMoRBQouXBKPZYLkOGctCZql3FilA5em7ff+P8rq9IXPRY8ekGYHHrn+tyJetnRCydV/oIkFPvtdVpYLlz0sjmb4yG2/e1WE0Ae1Zfv+Rzrf7ZfafwA9ToJOAj77HQAAAABJRU5ErkJggg==" /&gt;&amp;nbsp;&lt;/div&gt;As a special treat to our players, &lt;b&gt;Tim Hall of ORACLE-BASE.com&lt;/b&gt; fame is providing the SQL quizzes during the month of October. "Oracle ACE of the Year 2006" Tim Hall is an Oracle DBA/Developer and well known Oracle blogger at &lt;a href="http://www.oracle-base.com/"&gt;http://www.oracle-base.com&lt;/a&gt;. If that isn't enough, he's written two books and over 400 articles, is an Oracle ACE Director, has presented at numerous user groups and conferences worldwide and recently presented a series of 2-day PL/SQL tuning seminars in Europe and Asia-Pacific as part of the "Oracle University Celebrity Series."&lt;br /&gt;
&lt;br /&gt;
We are extremely pleased to have Tim offer his expertise and teaching skills to the PL/SQL Challenge for the month of October. We hope you enjoy - and are challenged by - Tim's quizzes!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-3826812634028360195?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/3826812634028360195/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/10/october-sql-quizzes-by-tim-hall-oracle.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/3826812634028360195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/3826812634028360195'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/10/october-sql-quizzes-by-tim-hall-oracle.html' title='October SQL Quizzes by Tim Hall, ORACLE-BASE.com!'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-4644746174178611806</id><published>2011-09-29T13:19:00.002+01:00</published><updated>2011-09-29T13:20:08.657+01:00</updated><title type='text'>VALUES OF not a valuable and correct solution? (8304)</title><content type='html'>The 28 September quiz asked the following:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;I must write a procedure that accepts an associative array as a  parameter, each of whose elements contains the primary key of a row in  that table, and then uses FORALL to update each row identified by one of  those primary keys. The associative array may not be densely filled (in  other words, there may be index values between the integers returned by  the FIRST and LAST methods that are not defined). Which of the choices  describe my options for implementing this procedure?&lt;/div&gt;&lt;br /&gt;
Several players wrote with concerns and questions, most of them having to do with this choice (scored as correct):&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: blue; display: block; overflow: hidden; width: 500px; word-wrap: break-word;"&gt;Use the VALUES OF clause with the FORALL statement.&lt;/span&gt;&lt;span style="display: block; overflow: hidden; width: 500px; word-wrap: break-word;"&gt; &lt;br /&gt;
Let's address that first, and then touch on the others. Players wrote as follows:&lt;br /&gt;
&lt;/span&gt;&lt;span style="display: block; overflow: hidden; width: 500px; word-wrap: break-word;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;span style="color: purple;"&gt;"I set the 'VALUES OF'-answer to wrong because this clause needs and only works  with indexes of type PLS_INTEGER. The documentation says: "The index collection  must be a nested table, or an associative array indexed by PLS_INTEGER or  BINARY_INTEGER, whose elements are also PLS_INTEGER or BINARY_INTEGER." You said  nothing about type of the index of the associative array, so I thought there  are some cases where this solution does not work "&lt;/span&gt;&lt;br /&gt;
&lt;div style="color: purple;"&gt;&lt;span style="display: block; overflow: hidden; width: 500px; word-wrap: break-word;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;span style="display: block; overflow: hidden; width: 500px; word-wrap: break-word;"&gt;&lt;/span&gt;&lt;span style="display: block; overflow: hidden; width: 500px; word-wrap: break-word;"&gt;&lt;/span&gt;&lt;span style="display: block; overflow: hidden; width: 500px; word-wrap: break-word;"&gt;&lt;/span&gt;"The last answer, using the "values of clause" is scored as correct, but you need  to write some extra code to populate a second collection. Using the same logic  the second answer, You will not be able to use FORALL, would be valid choice  too. Isn't it?"&lt;/div&gt;&lt;div style="color: purple;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="color: purple;"&gt;"Hello, I don't agree with the scoring of this quiz for the choice 4 ("Use the  VALUES OF clause with the FORALL statement.") - I thought this was a trick  question since FORALL ... VALUES OF ... cannot be used without the second  collection, which was not mentioned in the answer, whereas FORALL ... INDICES OF  ... can be used directly on our collection. It would have been better if the  answer for choice 4 had some mentioning of the second collection (although it  would have hinted that it was a correct answer). Based on the first choice, I  expected the wording for the fourth choice to be something similar ("Before  executing the FORALL statement populate a second collection with the index  values placed in its elements. Then use the VALUES OF clause with the FORALL  statement"). Actually, this is not a score adjustment request, just a  comment."&lt;/div&gt;&lt;br /&gt;
My thoughts: I suppose this is yet another example of the difficulties one may encounter with an "all words" quiz (as oppose to one based on specific code). The objective of the quiz was to make sure developers are aware of INDICES OF and VALUES OF as FORALL clauses that allow you to reference a sparse bind array in the FORALL's DML statement.&lt;br /&gt;
&lt;br /&gt;
The question does not specify any restrictions on how the procedure will implement the use of FORALL. It does not say that no other code can be written, no other collections can be defined and used. So from that standpoint, almost any choice  (except something on the order of "You will not be able to use FORALL in this scenario.") would &lt;i&gt;need &lt;/i&gt;to be scored as correct. Which we did.&lt;br /&gt;
&lt;br /&gt;
So I do not see why the VALUES OF choice would need to be scored as incorrect.&lt;br /&gt;
&lt;br /&gt;
Other comments and my responses:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: purple;"&gt;"1. The question refers to "that table" but didn't mention a table beforehand. 2.  The word "element" might be misinterpreted as referring to either the indexes or  the values in the associative array."&lt;/div&gt;&lt;br /&gt;
My response: yes "that table" was a typo. I will fix it, but I don't think it justifies a rescore. Element and index values: these two terms are used by Oracle in its documentation. An element is never used to refer to the index value, that I know of.&lt;br /&gt;
&lt;div style="color: purple;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="color: purple;"&gt;"In the PL/SQL Quiz from 2011-09-28 you stated:"I must write a procedure that  accepts an associative array as a parameter, each of whose elements contains the  primary key of a row in that table...". This is a litle bit confusing for me,  because I took into account the possibility, that primary key may also consist  of multiple columns, not only single column. Unfortunately, the question was for  me not so clearly defined... Please, could you explain, which solution would be  correct, if there is a multiple columns primary key"&lt;/div&gt;&lt;br /&gt;
My response: another very excellent point regarding the potential drawbacks of an "only words" quiz! Yes, I did not think about multiple column primary keys. That would certainly affect and complicate the implementation of the procedure (assuming it was a collection of records, you would have to write very different code in pre-Oracle11g versions, since you cannot reference a field of a collection-based record inside a FORALL until then), but my same point applies from above: I do not specify any restrictions on how the procedure is implemented, except that it use FORALL. So the correctness of choices would still not change.&lt;br /&gt;
&lt;br /&gt;
Well, that's my view on the 28 September quiz. How about you?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-4644746174178611806?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/4644746174178611806/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/09/values-of-not-valuable-and-correct.html#comment-form' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/4644746174178611806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/4644746174178611806'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/09/values-of-not-valuable-and-correct.html' title='VALUES OF not a valuable and correct solution? (8304)'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-1849789160937797700</id><published>2011-09-27T16:35:00.001+01:00</published><updated>2011-09-27T16:36:26.781+01:00</updated><title type='text'>Recent Quizzes from the PL/SQL Challenge</title><content type='html'>In the month of September (to date), over 1260 Oracle technologists submitted  14,360 answers to quizzes, and explored the library of past quizzes. Here is a  selection of quizzes from this month:&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Oracle PL/SQL Quizzes&lt;/h3&gt;&lt;br /&gt;
&lt;b&gt;12 September 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:651:1301936280678359::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:6967,7747&amp;amp;cs=1DFEA07D767600879D9F14F04C8CE4685" target="_blank"&gt;You can trap an exception by name or you can trap it with WHEN  OTHERS. If you know which exceptions &lt;i&gt;might&lt;/i&gt; be raised, it is generally  better to include a handler for that specific exception, usually so that you can  also log more specific information about what might have caused the  error.&lt;/a&gt;&lt;br /&gt;
610 Players ** Avg. Correct: 88% ** Avg. Time: 200 seconds ** Rating:  4 stars&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;13 September 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:651:1301936280678359::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:6968,7748&amp;amp;cs=1E1D77DFC41FF86198EC397ECF15883C3" target="_blank"&gt;When an exception is raised in the declaration section (such as by  assigning a too-long string as the default value for a variable), the exception  propagates out unhandled from that block - even if there is an exception section  and OTHERS clause.&lt;/a&gt;&lt;br /&gt;
638 Players ** Avg. Correct: 37% ** Avg. Time: 320  seconds ** Rating: 4 stars&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;14 September 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:651:1301936280678359::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:6969,7749&amp;amp;cs=14ACEB4669FD08F8989B8CCE3DA6AD5A5" target="_blank"&gt;If the body of your result cache function depends on settings that  might vary from session to session (such as &lt;code&gt;NLS_DATE_FORMAT&lt;/code&gt; and  &lt;code&gt;TIME ZONE&lt;/code&gt;), make the function result-cached only if you can modify  it to handle the variations in settings that might occur.&lt;/a&gt;&lt;br /&gt;
612 Players **  Avg. Correct: 69% ** Avg. Time: 259 seconds ** Rating: 4 stars&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;15 September 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:651:1301936280678359::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:6970,7750&amp;amp;cs=10DBB9A766BA71F4AD6488DADAC8D7B26" target="_blank"&gt;When comparing values that may be NULL, pay close attention to  handling all possible cases, to ensure that the correct Boolean value is  returned.&lt;/a&gt;&lt;br /&gt;
604 Players ** Avg. Correct: 65% ** Avg. Time: 212 seconds **  Rating: 4 stars&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;16 September 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:651:1301936280678359::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:6971,7751&amp;amp;cs=1C1E9B5F657DB85A41F03A318FD7C6706" target="_blank"&gt;In case a dynamic SQL statement makes repeated use of a  placeholder name, it is necessary to provide a bind value in the USING clause  for each occurrence. In the same situation, when executing a dynamic PL/SQL  block, only one value should be specified for each placeholder name, even if it  is used several times.&lt;/a&gt;&lt;br /&gt;
576 Players ** Avg. Correct: 64% ** Avg. Time: 220  seconds ** Rating: 4 stars&lt;br /&gt;
&lt;b&gt;19 September 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:651:1301936280678359::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:6972,7752&amp;amp;cs=13D6E2CE4847CDE02958825FF76B3D44F" target="_blank"&gt;When writing complex Boolean expressions with multiples ANDs and  ORs, remember that AND takes precedence over OR. Use parentheses to remove any  possible ambiguity in your understanding of how the statement will be  evaluated.&lt;/a&gt;&lt;br /&gt;
595 Players ** Avg. Correct: 94% ** Avg. Time: 156 seconds **  Rating: 4 stars&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;20 September 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:651:1301936280678359::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:6973,7753&amp;amp;cs=1FBFB0C9E5EFE62632D0860D6C8F094CF" target="_blank"&gt;Use CURRENT OF with FOR UPDATE to avoid writing or repeating  unnecessary logic in a WHERE clause for DELETEs and UPDATEs inside your  loop.&lt;/a&gt;&lt;br /&gt;
647 Players ** Avg. Correct: 88% ** Avg. Time: 278 seconds ** Rating:  4 stars&lt;br /&gt;
&lt;b&gt;21 September 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:651:1301936280678359::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:6974,7754&amp;amp;cs=1C5416B21CADCA3A3E578561E5E22CD8C" target="_blank"&gt;You cannot define a nested block as an autonomous transaction. If  you need that behavior, simply create a nested procedure within the nested  block, and then define that procedure as an autonomous transaction.&lt;/a&gt;&lt;br /&gt;
634  Players ** Avg. Correct: 72% ** Avg. Time: 343 seconds ** Rating: 4 stars&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;22 September 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:651:1301936280678359::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:6975,7755&amp;amp;cs=158A8174D947C33AD69F1B6E7B249E1DA" target="_blank"&gt;Make sure that any expressions executed within a loop must be  re-evaluated with each iteration of the loop body. If they do not change (they  are "loop invariants"), then execute the expression once, assign the outcome to  a local variable, and reference that variable inside the loop.&lt;/a&gt;&lt;br /&gt;
610  Players ** Avg. Correct: 65% ** Avg. Time: 400 seconds ** Rating: 4 stars&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;23 September 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:651:1301936280678359::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:6976,7756&amp;amp;cs=181777D9A82ECA44ED64B466B176EDEED" target="_blank"&gt;When writing complex numeric expressions involving several  different types of operators, make sure that you both understand the precedence  by which the operators are applied and that you use parentheses to ensure that  the expression is evaluated as desired.&lt;/a&gt;&lt;br /&gt;
589 Players ** Avg. Correct: 91% **  Avg. Time: 123 seconds ** Rating: 4 stars&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;SQL Quizzes&lt;/h3&gt;&lt;br /&gt;
Here are the SQL quizzes played in September:  &lt;b&gt;3 September 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:651:1301936280678359::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:6586,7366&amp;amp;cs=1C8112CA88DB80464FD0E3890DF5C4359" target="_blank"&gt;Use of analytic function COUNT with the RANGE clause to count  records with values within defined ranges.&lt;/a&gt;&lt;br /&gt;
520 Players ** Avg. Correct:  82% ** Avg. Time: 2082 seconds ** Rating: 4 stars&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;10 September 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:651:1301936280678359::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:6587,7367&amp;amp;cs=1EC03163BE1BA4E8ABD44619280AABF5F" target="_blank"&gt;Partitioned outer join is one of the most useful data  densification techniques available since Oracle10g.&lt;/a&gt;&lt;br /&gt;
526 Players ** Avg.  Correct: 61% ** Avg. Time: 4645 seconds ** Rating: 4 stars&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;17 September 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:651:1301936280678359::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:7426,8206&amp;amp;cs=1C5ABAA951B0C2F29443B3AC1AF673546" target="_blank"&gt;Use of analytic function RATIO_TO_REPORT to show "percent of  total" in select statements.&lt;/a&gt;&lt;br /&gt;
474 Players ** Avg. Correct: 72% ** Avg. Time:  2931 seconds ** Rating: 4 stars  &lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;APEX Quizzes&lt;/h3&gt;&lt;br /&gt;
Here are the APEX quizzes played in September:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;3 September 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:651:1301936280678359::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:6771,7551&amp;amp;cs=1DCED7A1684A79599BD1972DF0E8977C0" target="_blank"&gt;This question will teach users how the APEX data dictionary views  can be used to find out information about the applications in the  workspace.&lt;/a&gt;&lt;br /&gt;
223 Players ** Avg. Correct: 59% ** Avg. Time: 925 seconds **  Rating: 4 stars&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;10 September 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:651:1301936280678359::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:7107,7887&amp;amp;cs=15A6404EF26DD2165CC203664A3E31F4F" target="_blank"&gt;Shows different methods of customising error messages inside APEX  that will save time repeating code.&lt;/a&gt;&lt;br /&gt;
199 Players ** Avg. Correct: 56% **  Avg. Time: 208 seconds ** Rating: 4 stars&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;17 September 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:651:1301936280678359::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:7405,8185&amp;amp;cs=176D592D7E053D566942089F47E65D11F" target="_blank"&gt;Learm how to correctly send emails using the apex_mail.send  procedure.&lt;/a&gt;&lt;br /&gt;
206 Players ** Avg. Correct: 66% ** Avg. Time: 2206 seconds **  Rating: 4 stars&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-1849789160937797700?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/1849789160937797700/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/09/recent-quizzes-from-plsql-challenge.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/1849789160937797700'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/1849789160937797700'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/09/recent-quizzes-from-plsql-challenge.html' title='Recent Quizzes from the PL/SQL Challenge'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-12296289689534584</id><published>2011-09-26T17:21:00.000+01:00</published><updated>2011-09-26T17:21:24.466+01:00</updated><title type='text'>What's the value of using %TYPE for parameters?</title><content type='html'>I received this question from a player last week:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;This is not a question about the 13 September quiz in particular, but a related issue that  it raises in my mind. I know that I should never do this:&lt;/div&gt;&lt;pre style="color: blue;"&gt;l_myval VARCHAR2(100);
&lt;/pre&gt;&lt;div style="color: blue;"&gt;when I can do this:&lt;/div&gt;&lt;pre style="color: blue;"&gt;l_myval mytab.col1%TYPE;
&lt;/pre&gt;&lt;div style="color: blue;"&gt;But what about parameters? Until  Tuesday's quiz, I assumed that the constraints on subtypes and anchored  parameter would be checked. Now I see that they're not. So is there any advantage in writing&lt;/div&gt;&lt;pre style="color: blue;"&gt;PROCEDURE myproc(p_in IN mytable.col1%TYPE)&amp;nbsp;&lt;/pre&gt;&lt;div style="color: blue;"&gt;instead of:&lt;/div&gt;&lt;pre style="color: blue;"&gt;PROCEDURE myproc(p_in IN VARCHAR2)
&lt;/pre&gt;&lt;div style="color: blue;"&gt;? The only advantage that I can see is that  the first version might make it more obvious how the procedure is intended to be  used.&lt;/div&gt;&lt;br /&gt;
Rather than answer with my views immediately, I thought I'd offer it up to our players to see what you think.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-12296289689534584?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/12296289689534584/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/09/whats-value-of-using-type-for.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/12296289689534584'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/12296289689534584'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/09/whats-value-of-using-type-for.html' title='What&apos;s the value of using %TYPE for parameters?'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-3245924634310486151</id><published>2011-09-24T13:01:00.000+01:00</published><updated>2011-09-24T13:01:46.989+01:00</updated><title type='text'>Players report disabled RESULT CACHE...why?</title><content type='html'>The 14 September quiz tested players' knowledge of the Oracle Database 11g function result cache feature.&lt;br /&gt;
&lt;br /&gt;
Two players wrote to say that their tests did not reproduce the results claimed by our verification code.&lt;br /&gt;
&lt;br /&gt;
It seemed as though the result cache was not working for them. They are both running Enterprise Edition. One player reported the following:&lt;br /&gt;
&lt;div style="color: blue;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;/div&gt;&lt;pre style="color: blue;"&gt;SQL&amp;gt; show parameter result_cache

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
client_result_cache_lag              big integer 3000
client_result_cache_size             big integer 0
result_cache_max_result              integer     5
result_cache_max_size                big integer 0
result_cache_mode                    string      MANUAL
result_cache_remote_expiration       integer     0

SQL&amp;gt; ALTER SYSTEM SET RESULT_CACHE_MAX_SIZE =128M;

System altered.

SQL&amp;gt; show parameter result_cache

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
client_result_cache_lag              big integer 3000
client_result_cache_size             big integer 0
result_cache_max_result              integer     5
result_cache_max_size                big integer 0
result_cache_mode                    string      MANUAL
result_cache_remote_expiration       integer     0

SQL&amp;gt; select dbms_result_cache.status from dual;

STATUS
--------------------------------------------------------------------------------
BYPASS
&lt;/pre&gt;&lt;div style="color: blue;"&gt;My Result Cache is disabled and after repeated tries, I am unable to enable it and have no clue how I can fix this.&lt;/div&gt;&lt;br /&gt;
I am at a loss to explain to these players how to get the result cache feature enabled. So I thought I would invite the PL/SQL Challenge community to offer its wisdom. Any ideas?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-3245924634310486151?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/3245924634310486151/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/09/players-report-disabled-result-cachewhy.html#comment-form' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/3245924634310486151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/3245924634310486151'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/09/players-report-disabled-result-cachewhy.html' title='Players report disabled RESULT CACHE...why?'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-5748738569502134150</id><published>2011-09-23T12:19:00.000+01:00</published><updated>2011-09-23T12:19:58.377+01:00</updated><title type='text'>"Could" Changes Really Improve Performance? (7755)</title><content type='html'>The 22 September quiz asked you to analyze a piece of code and decide:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: blue;"&gt;Which of the choices describe a change I can make to the plch_emp_loop  procedure that will not affect the external behavior of the procedure  (what it displays or which rows it updates), but could improve its  performance?&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
The quiz was intended to be about your ability to identify &lt;i&gt;loop invariants&lt;/i&gt;, expressions within the body of the loop whose outcomes do not change with each execution of the loop. A standard optimization step is to replace&amp;nbsp; the invariants with a variable (or better yet a constant!) that is not re-evaluated with each iteration of the loop.&lt;br /&gt;
&lt;br /&gt;
Several players wrote with concerns about the way this question was worded and scored:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;1. Hi Steven, I usually do not complain about quizzes, but I felt that yesterdays  quiz was a little bit vague and not up to par or standards of the plsql challenge. First thing is how the question is formed. I don't like vague words  like could to be in a quiz. The should always be will, specially when it comes  to performance enhancements. But looking at the question itself. "Which of the  choices describe a change I can make to the plch_emp_loop procedure that will  not affect the external behavior of the procedure (what it displays or which  rows it updates), but could improve its performance?". What if all the data in  the table have salaries less that the minimum. Then this procedure never runs  and the enhancements have no effect at all anyways. 2 answer came out wrong for  me, probably because I emphasized too much on the performance part of the  question rather that reading the code itself. Therefore I fell into the SYSDATE  trap, marking it as correct. It does improve performance, there is no doubt of  that, but it of course is a changing variable and therefore will change the  internal running of the program. The other one was the number 8123 "l_year  NUMBER := TO_CHAR (date_in, 'YYYY');" This will make the IF statement later an  implicit conversion (CHAR =&amp;gt; NUMBER), that will not neccessarily run faster  and therefore I don't think it could be a correct answer.&lt;/div&gt;&lt;br /&gt;
&lt;div style="color: purple;"&gt;2. How much performance gain do you expect to get from changing from the explicit  conversion TO_CHAR (date_in, 'YYYY') to the implicit conversion of l_year? I  tried it, and I didn't get any significant gain.&lt;/div&gt;&lt;br /&gt;
&lt;div style="color: blue;"&gt;3. Answer 3 and 4 of the 22 sept quiz contradict! On 31-12-2010 to 01-01-2011 the  year changes. PS answer 3 makes an assumption about what date should be used and  that changing de date is the best programming solution. &lt;/div&gt;&lt;br /&gt;
&lt;div style="color: purple;"&gt;4. Option 3 was scored as incorrect: " The question did not include any constraints  on when and for how long this program runs. If during the execution of the  procedure, the hour changes, then we cannot safely extract the TO_CHAR (SYSDATE,  'HH24') expression and evaluate it just once at the start of the procedure."  This statement is correct but I think this is not a very good example. It is a  correct that the hour can change during the running of the program, but do you  want to have just a part of your employees updated during a run of the program;  I don't think so!&lt;/div&gt;&lt;br /&gt;
&lt;div style="color: blue;"&gt;5. An answer in quiz 5142 states "The question did not include any constraints on  when and for how long this program runs", but the quiz question says "never  takes more than 4 hours to complete" - so I would have thought it would be safe  to capture l_hour - although I guess it depends on when the program was  launched. I was also curious about the affect on performance on the function  call to plch_config.min_salary, since it is just an assignment, no conversion  required - performance gain almost nominal?&lt;/div&gt;&lt;br /&gt;
I will offer some responses here, but then open it up for discussion from players.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;I used the word "could" because I wanted players to focus on a logical analysis of the code (what in theory could improve performance? and not so much on analyzing the actual gains of specific changes, which as some noted could be very minimal indeed).&lt;/li&gt;
&lt;li&gt;Excellent point about the change to l_year resulting in an implicit conversion, when previously there was no conversion. I did not catch that and I believe it makes that choice ambiguous, not clearly a net performance gain when the loop invariant is extracted. I think I will probably need to issue a correction for that choice.&lt;/li&gt;
&lt;li&gt;The answer for choice 3 was incorrect and has been changed to remove the leading sentence. I &lt;i&gt;added&lt;/i&gt; time constraint text to the question, but forgot to remove this from the answer.&lt;/li&gt;
&lt;li&gt;I do not see a contradiction between answers 3 and 4 (8122 and 8123 to use their IDs).The year does not change while the program executes, based on " it is only executed during the first month of each quarter (January,  April, July and October) and never takes more than 4 hours to complete".&lt;/li&gt;
&lt;/ul&gt;Other comments and points of analysis?&lt;br /&gt;
&lt;ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-5748738569502134150?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/5748738569502134150/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/09/could-changes-really-improve.html#comment-form' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/5748738569502134150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/5748738569502134150'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/09/could-changes-really-improve.html' title='&quot;Could&quot; Changes Really Improve Performance? (7755)'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-9159218965233032214</id><published>2011-09-14T12:29:00.000+01:00</published><updated>2011-09-14T12:29:08.130+01:00</updated><title type='text'>New Poll on Changing Question Type</title><content type='html'>The type of question for the 13 September quiz was changed from "only one choice correct" to a normal multiple choice question after the quiz was closed. This was done because a player noted the following:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;"This is a prime example of a quiz that should not be "at most one" correct choice. More than one concept is being tested; however, if a player is weak in any part then the player receives no credit. The results of the quiz would have been more indicative of players' relative knowledge had each exception scenario been presented as an independent selection."&lt;/div&gt;&lt;br /&gt;
And we agreed. &lt;br /&gt;
&lt;br /&gt;
But another player then objected to this change, saying: &lt;span style="color: blue;"&gt;"This is unfair towards the players who consumed extra time to try to answer correctly, for avoiding scoring zero points."&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;div style="color: blue;"&gt;&lt;br /&gt;
&lt;/div&gt;Our feeling is that you should be making your best effort to answer the question correctly, regardless of the type of question, and so if we make a mistake in how we set up the question, we should fix it. But we are not competing in the daily quiz, so we may not understand well how all of our players see this issue.&lt;br /&gt;
&lt;br /&gt;
We have set up a poll on the PL/SQL Challenge website to find out how you feel about it. Please take the poll and/or add your thoughts to this posting.&lt;br /&gt;
&lt;br /&gt;
Cheers,&lt;br /&gt;
Steven Feuerstein&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-9159218965233032214?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/9159218965233032214/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/09/new-poll-on-changing-question-type.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/9159218965233032214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/9159218965233032214'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/09/new-poll-on-changing-question-type.html' title='New Poll on Changing Question Type'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-5029028263079139173</id><published>2011-09-12T17:42:00.000+01:00</published><updated>2011-09-12T17:42:27.756+01:00</updated><title type='text'>New Play a Quiz Features</title><content type='html'>As explained in a previous blog &lt;a href="http://plsql-challenge.blogspot.com/2011/09/finding-quizzes-in-play-quiz.html"&gt;posting&lt;/a&gt;, the Play a Quiz table on the home page has gotten very full and busy. Players  have been complaining about not being able to find the quizzes they need to  take, or recently took.&lt;br /&gt;
&lt;br /&gt;
So over the weekend we put in place a number of changes that should help you:&lt;br /&gt;
&lt;br /&gt;
1. Moved Play a Quiz to the top of the page&lt;br /&gt;
2. Save filter setting as default&lt;br /&gt;
3. Quick access to My Technologies&lt;br /&gt;
4. Separate tab for Taken/Closed quizzes&lt;br /&gt;
&lt;br /&gt;
Taken altogether, the home page now looks like this:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-JHaGjatnpNU/Tm42RL6m4-I/AAAAAAAAAGw/F8iiE_2hXZA/s1600/paq6.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="139" src="http://3.bp.blogspot.com/-JHaGjatnpNU/Tm42RL6m4-I/AAAAAAAAAGw/F8iiE_2hXZA/s640/paq6.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
The Not Taken tab will show you all quizzesthat are open (can be played). Note that you might not be eligible to play all of them (such as the quarterly playoff), but for the most part they will be precisely those quizzes you can play. Quizzes are ordered by those that will be over soonest.&lt;br /&gt;
&lt;br /&gt;
The Taken/Closed tab shows you only those quizzes that you have taken or are closed (you missed the chance to take them). Those quizzes you answered most recently appear at the top of the list.&lt;br /&gt;
&lt;br /&gt;
If you only want to see quizzes for technologies in which you are interested, change the filter to My Technologies:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-aaCYUxDm-IE/Tm41bg5VexI/AAAAAAAAAGs/wZ9399sJtDw/s1600/paq7.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-aaCYUxDm-IE/Tm41bg5VexI/AAAAAAAAAGs/wZ9399sJtDw/s1600/paq7.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;And if you don't want to have to change this filter setting each time you visit the home page, click on "Save Filter as Default".&lt;br /&gt;
&lt;br /&gt;
Finally, if you want to change any of the settings for the technologies in which you are interested, click on "Edit My Technologies" to take you directly to the Technologies to Play page of your account.&lt;br /&gt;
&lt;br /&gt;
We hope these changes make it easier to play your quizzes and review the results &lt;i&gt;after&lt;/i&gt; you've played.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-5029028263079139173?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/5029028263079139173/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/09/new-play-quiz-features.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/5029028263079139173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/5029028263079139173'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/09/new-play-quiz-features.html' title='New Play a Quiz Features'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-JHaGjatnpNU/Tm42RL6m4-I/AAAAAAAAAGw/F8iiE_2hXZA/s72-c/paq6.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-879100982341134750</id><published>2011-09-12T17:30:00.000+01:00</published><updated>2011-09-12T17:30:28.418+01:00</updated><title type='text'>IE8 and Compatibility View: TURN IT OFF!</title><content type='html'>While we continue to have problems displaying the plsqlchallenge.com site on IE7, I was particularly dismayed to receive a bug report regarding IE&lt;i&gt;8&lt;/i&gt;. A player reported that when he visited the home page, it looked like this:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-_MEc_ZIdLbo/Tm4y5Ya6jHI/AAAAAAAAAGg/e1ZndKzOufI/s1600/paqcompat.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="235" src="http://4.bp.blogspot.com/-_MEc_ZIdLbo/Tm4y5Ya6jHI/AAAAAAAAAGg/e1ZndKzOufI/s400/paqcompat.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Not good.&lt;br /&gt;
&lt;br /&gt;
And what bothered me most of all is that on my laptop, PLSQLChallenge.com works just fine on IE8.&lt;br /&gt;
&lt;br /&gt;
Well, it took a little bit of investigation, but we finally discovered that if you have Compatibility View turned &lt;i&gt;on&lt;/i&gt; in IE8 (and, likely, in IE9 as well), you end up with a home page like that shown to the left.&lt;br /&gt;
&lt;br /&gt;
If, on the other hand, I turn off Compatibility View, the home page displays without any problem. So if your home page looks weird, check this setting before you submit a bug report:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-X0BEgPKAVBQ/Tm4zg5PhVkI/AAAAAAAAAGk/SgGkF3BfKx0/s1600/compatview.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="243" src="http://1.bp.blogspot.com/-X0BEgPKAVBQ/Tm4zg5PhVkI/AAAAAAAAAGk/SgGkF3BfKx0/s400/compatview.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-879100982341134750?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/879100982341134750/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/09/ie8-and-compatibility-view-turn-it-off.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/879100982341134750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/879100982341134750'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/09/ie8-and-compatibility-view-turn-it-off.html' title='IE8 and Compatibility View: TURN IT OFF!'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-_MEc_ZIdLbo/Tm4y5Ya6jHI/AAAAAAAAAGg/e1ZndKzOufI/s72-c/paqcompat.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-5536533774404769318</id><published>2011-09-12T13:12:00.002+01:00</published><updated>2011-09-12T13:14:46.138+01:00</updated><title type='text'>PL/SQL Challenge Activity Summary for 5 September 2011 - 9 September  2011</title><content type='html'>&lt;h3&gt;Oracle PL/SQL Quizzes&lt;/h3&gt;In the past week (5 September - 9 September), 822 Oracle technologists were  busy submitting 2,465 answers to quizzes and exploring the library of past quizzes. Here are the PL/SQL quizzes played in that period:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;5 September 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:651:4417346694969191::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:6473,7251&amp;amp;cs=1E9C86FFCBD1980B974FE072DD0B7D5A0"&gt;PLS_INTEGER  and its subtypes will raise an overflow error if the value assigned to it is greater than 2147483647; SIMPLE_INTEGER will "wrap around" to -2147483648 and  "count up" from there.&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;550  Players ** Avg. Correct: 72% ** Avg. Time: 219 seconds ** Rating: 4 stars&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;6 September 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:651:4417346694969191::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:6474,7252&amp;amp;cs=1063799E64DE7BFDFF260F510787F0C82"&gt;PL/SQL  offers a number of ways to retrieve multiple rows from a dynamic SQL query; OPEN-FOR is especially helpful when you plan to use the BULK COLLECT clause as  you fetch, but also want to use the LIMIT clause to manage memory consumption.&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;658 Players ** Avg. Correct: 78% ** Avg. Time: 321 seconds ** Rating: 4 stars&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;7 September 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:651:4417346694969191::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:6475,7253&amp;amp;cs=1E008168E51A2CF0028A94997E3101161"&gt;It  is often necessary to continue executing your application code, even after an  error is raised. Both SAVE EXCEPTIONS and LOG ERRORS allow you to do this when errors occur in DML statements. It is important, however, to be aware of the differences between the two, and choose the feature that best matches your requirements.&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;642  Players ** Avg. Correct: 63% ** Avg. Time: 282 seconds ** Rating: 4 stars&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;8 September 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:651:4417346694969191::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:6476,7254&amp;amp;cs=19CCE1A2ACDDC479637207D845482E611"&gt;Oracle will perform implicit conversions under many circumstances. Often, such  conversions will have no or minimal impact on performance or correctness. Generally, however, it is best to perform explicit conversions to ensure correct behavior of your  programs.&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;632  Players ** Avg. Correct: 6% ** Avg. Time: 567 seconds ** Rating: 4 stars&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;9 September 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:651:4417346694969191::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:6477,7255&amp;amp;cs=172BF24A8202E54FAB184817DB21639A0"&gt;When you need to check for and match on a NULL value in your CASE statement or expression, you need to use a searched, not simple, CASE format.&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;560 Players ** Avg. Correct: 81% ** Avg. Time: 191 seconds ** Rating: 4 stars&lt;br /&gt;
&lt;h3&gt;SQL Quizzes&lt;/h3&gt;Between 13 August - 9 September, Oracle technologists played these SQL quizzes:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;13 August 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:651:4417346694969191::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:5146,5926&amp;amp;cs=1FB47F4AFC5CF97E51EE05B16801C77A0"&gt;Whenever  your column values may contain NULLs, you should be very careful in how you construct your SQL statement to take this into  account.&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;494 Players ** Avg. Correct: 89% ** Avg. Time: 894 seconds ** Rating: 4 stars&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;20 August 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:651:4417346694969191::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:6125,6905&amp;amp;cs=10EFB878EFB3C2CDF2B47067DCE9A4131"&gt;If  a condition refers to an aggregate function, put that condition in the HAVING  clause. Otherwise, use the WHERE clause. It is always recommended to include ORDER BY Clause in order to sort records. Don't rely on possible implicit sorting of GROUP BY  Clause.&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;517 Players ** Avg. Correct: 70% ** Avg. Time: 627 seconds ** Rating: 4 stars&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;27 August 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:651:4417346694969191::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:6585,7365&amp;amp;cs=18BE1449F53A813416DDC57AAA2630D53"&gt;The NULL value is not a value like "abc" or 123. It actually means "there is no value" and is handled very differently by Oracle from any non-NULL values.&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;526  Players ** Avg. Correct: 79% ** Avg. Time: 301 seconds ** Rating: 4 stars&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;3 September 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:651:4417346694969191::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:6586,7366&amp;amp;cs=1C8112CA88DB80464FD0E3890DF5C4359"&gt;Use of analytic function COUNT with the RANGE clause to count records with values within defined ranges.&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 523  Players ** Avg. Correct: 82% ** Avg. Time: 2070 seconds ** Rating: 4 stars&lt;br /&gt;
&lt;h3&gt;Oracle Application Express Quizzes&lt;/h3&gt;Between 13 August - 9 September, Oracle technologists played these  APEXquizzes:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;13 August 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:651:4417346694969191::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:5791,6572&amp;amp;cs=140AA750F81B80DD692836A4A54E81F92"&gt;Use  validation functions for plug-in items so that you can build validations  &lt;i&gt;into&lt;/i&gt; the plug-in, and avoid writing validations on each page where a relevant item appears. Use built-in APEX procedures to communicate errors to the user.&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;237  Players ** Avg. Correct: 62% ** Avg. Time: 755 seconds ** Rating: 4 stars&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;20 August 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:651:4417346694969191::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:5792,6573&amp;amp;cs=10EB09C3AD3D992558855A729421B4E26"&gt;Dynamic actions are one of most exciting features of APEX 4.&amp;nbsp; They allow actions to be performed that previously would have been done with jQuery. As well as the built-in dynamic actions you also have the option of entering your own Javascript. Some issues that may arise when incorrectly coding dynamic actions are outlined below as well as the best pratices.&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;232  Players ** Avg. Correct: 56% ** Avg. Time: 983 seconds ** Rating: 4 stars&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;27 August 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:651:4417346694969191::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:6591,7371&amp;amp;cs=1BCA80E2E943ABB3FF9D54D7FAF4529A1"&gt;By using a combination of application processes, page groups and conditions you can &lt;br /&gt;
conditionally hide or show items in the application. Page groups allow the applications pages to be easily grouped and subsequently identified as to which pages they are related too and what part of the application they are used in. It helps to understand the different syntax that can be used within a condition.&amp;nbsp; It highlights two different methods of setting a condition with a "PL/SQL Expression" and the "Value of Item in Expression 1 = Expression 2".&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;241  Players ** Avg. Correct: 62% ** Avg. Time: 1939 seconds ** Rating: 4 stars&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;3 September 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:651:4417346694969191::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:6771,7551&amp;amp;cs=1DCED7A1684A79599BD1972DF0E8977C0"&gt;This question will teach users how the APEX data dictionary views can be used to find out information about the applications in the workspace.&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;226  Players ** Avg. Correct: 59% ** Avg. Time: 913 seconds ** Rating: 4  stars&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-5536533774404769318?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/5536533774404769318/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/09/plsql-challenge-activity-summary-for-5.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/5536533774404769318'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/5536533774404769318'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/09/plsql-challenge-activity-summary-for-5.html' title='PL/SQL Challenge Activity Summary for 5 September 2011 - 9 September  2011'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-4229603342515451673</id><published>2011-09-09T18:01:00.000+01:00</published><updated>2011-09-09T18:01:37.718+01:00</updated><title type='text'>Mysteries of Implicit Conversions (7254)</title><content type='html'>The 8 August quiz asked you to determine how many conversions Oracle performs for us implicitly when the following block is executed:&lt;br /&gt;
&lt;pre&gt;DECLARE
   l_timestamp   TIMESTAMP := '2011-08-01';
   l_increment   PLS_INTEGER := SUBSTR ('10x10=100', 4, '2');
BEGIN
   DBMS_OUTPUT.put_line (
      TO_DATE (l_timestamp) + (l_increment || 0));
END;
/
&lt;/pre&gt;We scored 8 as the correct answer. Two players wrote with the following observations:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;1. The strange thing here is the fact that over the different versions, Oracle has  changed the overloadings of PUT_LINE in the DBMS_OUTPUT package. Specifically,  in Oracle 7.3.4.0.0 there were 3 overloads, for VARCHAR2, NUMBER and DATE. This  was even explicitly mentioned in the following:  http://www.en8848.com.cn/reilly%20books/books/oracle/advprog/ch02_08.htm In  Oracle 8.1.7.4.1, there remained only two overloads, for VARCHAR2 and NUMBER. In  Oracle 10g and higher there remained only a single overload, for VARCHAR2. Why  did Oracle do this ? Just for introducing an additional implicit conversion ? I  even remember a version where using DBMS_OUTPUT.put_line( a_number ) used to  fail, and you had to use an explicit DBMS_OUTPUT.put_line( TO_CHAR(a_number) ).  In the older versions, when the overloads exist, the argument passed was indeed  stored in the DBMS_OUTPUT buffer in its native data type, and only converted to  a string when retrieved for display (ex. by SQL*PLUS ). This one is probably the  one that many players have missed ... In fact, we use this "bad practice" day by  day in the quiz, DBMS_OUTPUT.put_line is the top star of each pl/sql block ...  Does anybody think that we should change this ? I would hardly believe it ...&amp;nbsp;&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="color: blue;"&gt;By  the way, enabling the PLSQL_WARNINGS do NOT produce any warnings for any of  these 8 implicit conversions, strange by itself ... ( tested in Oracle  11.1.0.7.0 ).&amp;nbsp;&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="color: blue;"&gt;Anyway, this quiz was a too high price payed for a small issue ...  Like in the last playoff, 0 or 7 versus the correct 8 were scored the same :( :(  ... which is not completely right in my opinion, because here recognizing each  implicit conversion by itself has its own value as "piece of knowledge", and  cannot/should not be completely cancelled ... Specifically for such "total"  quizzes, better than making them single choice is to allow for different choices  with different "weights" (and scoring), that would reflect knowledge more  accurately.&lt;/div&gt;&lt;br /&gt;
&lt;div style="color: #274e13;"&gt;2. I think there may be two additional implicit conversions that are taking place,  revolving around the Date + Number in the dbms_output.put_line statement.  Although it is often said that dates are internally stored in a numeric format,  it is not the same format as a numeric datatype (See reference to Concepts  manual). In addition, although the (+) operation can be used with date  variables, the actual (+) operation only takes place with numeric datatypes or  any datatype that can be implicitly converted to a numeric datatype (see  reference SQL Reference manual). Thus, to perform the operation Date + Number,  Oracle is internally converting the Date to a number, performing the addition  operation, and then converting the result back to a Date. This implicit  conversion is different from the others referenced in the question, as there is  no (to_xxx) operation that can explicitly perform this operation; it is all done  internally to perform (+) operations with Date datatypes. Thus, the total number  of implicit conversions for the block of code is 10.&amp;nbsp;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="color: #274e13;"&gt;From 10.2 Concepts Manual  Chapter 26 "Oracle stores numeric data in variable-length format. Each value is  stored in scientific notation, with 1 byte used to store the exponent and up to  20 bytes to store the mantissa. The resulting value is limited to 38 digits of  precision." "Date data is stored in fixed-length fields of seven bytes each,  corresponding to century, year, month, day, hour, minute, and second." From 10.2  SQL Reference Chapter 4, page 3. "You can use an arithmetic operator with one or  two arguments to negate, add, subtract, multiply, and divide numeric values.  Some of these operators are also used in datetime and interval arithmetic. The  arguments to the operator must resolve to numeric datatypes or to any datatype  that can be implicitly converted to a numeric datatype."&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Your thoughts?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-4229603342515451673?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/4229603342515451673/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/09/mysteries-of-implicit-conversions-7254.html#comment-form' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/4229603342515451673'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/4229603342515451673'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/09/mysteries-of-implicit-conversions-7254.html' title='Mysteries of Implicit Conversions (7254)'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-8031054077313506997</id><published>2011-09-08T23:51:00.000+01:00</published><updated>2011-09-08T23:51:41.823+01:00</updated><title type='text'>SAVE EXCEPTIONS and LOG ERRORS: objections raised (7253)</title><content type='html'>The 7 September quiz asked you to compare and contrast the use of SAVE EXCEPTIONS and LOG ERRORS, two mechanisms for continuing past errors raised in DML statements.&lt;br /&gt;
&lt;br /&gt;
Three players wrote with objections, two concerning this choice, which was scored as correct:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;When  you use SAVE EXCEPTION with FORALL statement, if any of the DML statements fail, changes made to rows by those DML statements are rolled  back. When you use LOG ERRORS with your DML statement and that  statement fails, Oracle will &lt;i&gt;not&lt;/i&gt; necessarily roll back all changes to rows modified by that statement.&lt;/div&gt;&lt;br /&gt;
1. "I think that this choice is scored wrongly. If we use FORALL with  SAVE EXCEPTIONS, the changes performed by the previous DML-s ( the previous  successful iterations of the same FORALL statement ) ARE NOT rolled back."&lt;br /&gt;
&lt;br /&gt;
2.&amp;nbsp; "I suppose, that when you use "LOG ERRORS" clause, words "statement fails" mean  only one thing: that number of invalid records  have exceeded LIMIT value, and statement immediately stopped with exception. In  that case, as I know, Oracle will necessarily roll back all changes to rows  modified by that statement. In other hand, when number of erroneous records has  not reached LIMIT value, your statement does not fail, it finished successfully."&lt;br /&gt;
&lt;br /&gt;
My response to #1: I don't see this point. We are saying in the choice that the changes made by any &lt;i&gt;failed statement&lt;/i&gt; are rolled back. We don't even talk about successful statements - and you are right, those are &lt;i&gt;not &lt;/i&gt;rolled back.&lt;br /&gt;
&lt;br /&gt;
My response to #2: ARGH! I think you make a very good point; we were a bit sloppy with words here. The DML statement as a whole does &lt;i&gt;not&lt;/i&gt; fail, just because an attempt to change a row identified by that statement fails. The statement, in fact, continues to execute. &lt;br /&gt;
&lt;br /&gt;
One player also wrote regarding this choice:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;You can use FORALL SAVE EXCEPTIONS with dynamic SQL, but LOG ERRORS may only be used with static DML statements.&lt;/div&gt;&lt;br /&gt;
He said: "In the answer 4 example, FORALL is NOT part of the dynamic DML. So I doubt the  question can be answered in a clear way given this example. I guess my objection  will be overruled by pointing out the choice of the phrase "used with dynamic  DML". Well, my grandmother could cook a great meal WITH dynamic DML, if  necessary."&lt;br /&gt;
&lt;br /&gt;
My response: I don't really get it. You are right; FORALL is not part of either the static or dynamic DML statement  that is "attached" to the FORALL header. But my sentence doesn't claim that it  is, does it?&lt;br /&gt;
&lt;br /&gt;
It simply asserts that you can do this&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;FORALL  ...&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;SAVE EXCEPTIONS&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;EXECUTE IMMEDIATE my_dynamic_dml;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
That is, I  can "use" FORALL SAVE EXCEPTIONS to execute a dynamic SQL statement.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I am interested to hear your comments; at this moment, though, I am inclined to issue a re-scoring on choice #483, and correct the verbiage to the following (change in &lt;b&gt;bold&lt;/b&gt;):&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;When  you use SAVE EXCEPTION with FORALL statement, if any of the DML  statements fail, changes made to rows by those DML statements are rolled   back. When you use LOG ERRORS with your DML statement &lt;b&gt;and an attempt to update a row fails&lt;/b&gt;, Oracle will &lt;i&gt;not&lt;/i&gt; necessarily roll back all changes to rows modified by that statement.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-8031054077313506997?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/8031054077313506997/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/09/save-exceptions-and-log-errors.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/8031054077313506997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/8031054077313506997'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/09/save-exceptions-and-log-errors.html' title='SAVE EXCEPTIONS and LOG ERRORS: objections raised (7253)'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-3623486395362446644</id><published>2011-09-06T15:39:00.002+01:00</published><updated>2011-09-06T15:40:00.827+01:00</updated><title type='text'>Finding Quizzes in Play a Quiz</title><content type='html'>Since the upgrade to v2 of the PL/SQL Challenge quiz platform, we have taken advantage of its flexibility to add several new quizzes: weekly SQL, PL/SQL and logic quizzes; the newest, Toad for Oracle weekly quiz; the Oracle Magazine PL/SQL 101 quiz.&lt;br /&gt;
&lt;br /&gt;
As a result, the Play a Quiz table on the home page has gotten very full and busy. Players have been complaining about not being able to find the quizzes they need to take, or recently took. We are looking at a number of changes to avoid this confusion. In the meantime, here is an explanation of the steps you can take right now to gain clarity.&lt;br /&gt;
&lt;br /&gt;
The Play a Quiz table has two tabs: Current and Upcoming. Current shows you all open quizzes that you can take, as well as some that you recently completed. You can use the Filter to restrict which quizzes are shown. You can also see other "current" quizzes by clicking on the right arrow in the bottom right corner of the table. Finally, the "View All Competitions" will take you to an Interactive Report that will allow you to search for &lt;i&gt;any&lt;/i&gt; quiz that has already been played.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-2WUsYu_L6sQ/TmYuG5wNYYI/AAAAAAAAAGQ/y0hFsQEgh9Q/s1600/paq1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="295" src="http://3.bp.blogspot.com/-2WUsYu_L6sQ/TmYuG5wNYYI/AAAAAAAAAGQ/y0hFsQEgh9Q/s400/paq1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Use the filter to show quizzes for a specific technology, only those that are still open or only those for a technology in which you have expressed interest ("My Technologies"; more on this below).&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-dbsMyyomKao/TmYvK-olWzI/AAAAAAAAAGU/FpAbPkwEQFg/s1600/paq2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="122" src="http://4.bp.blogspot.com/-dbsMyyomKao/TmYvK-olWzI/AAAAAAAAAGU/FpAbPkwEQFg/s400/paq2.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;b&gt;My Technologies&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As you can see, we offer quizzes for PL/SQL, SQL, APEX, Logic and Toad for Oracle (with more likely to come!). By default, we show quizzes for all technologies on the page. And if you take a quiz for one of these technologies, we automatically update your profile, adding this technology to your list.&lt;br /&gt;
&lt;br /&gt;
If you choose "My Technologies" in the filter list, then only those quizzes for &lt;i&gt;your&lt;/i&gt; technologies will appear. So if you are not an APEX developer and you've never played an APEX quiz, that is the quickest way to make APEX quizzes disappear from Play a Quiz.&lt;br /&gt;
&lt;br /&gt;
Note: we will likely add the ability to save your Filter by selection so you do not have to keep changing it when you get to the Home page.&lt;br /&gt;
&lt;br /&gt;
To modify your technology list, visit your Account (click on "Account" in top right corner) and then click on "Technologies for Play":&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-VbqcCvuwitg/TmYv2nEmVTI/AAAAAAAAAGY/GG89f3pw_9w/s1600/paq3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="361" src="http://1.bp.blogspot.com/-VbqcCvuwitg/TmYv2nEmVTI/AAAAAAAAAGY/GG89f3pw_9w/s400/paq3.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
You can then add or remove the technologies as desired:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-RPD8mL4zyUA/TmYwJC6m1rI/AAAAAAAAAGc/5RFLYgJs7xw/s1600/paq4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="115" src="http://1.bp.blogspot.com/-RPD8mL4zyUA/TmYwJC6m1rI/AAAAAAAAAGc/5RFLYgJs7xw/s400/paq4.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
I hope this information helps you get the most out of the PL/SQL Challenge generally, and the Play a Quiz table more specifically.&lt;br /&gt;
&lt;br /&gt;
Please offer any suggestions you have for improving how this works.&lt;br /&gt;
&lt;br /&gt;
Cheers, Steven&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-3623486395362446644?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/3623486395362446644/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/09/finding-quizzes-in-play-quiz.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/3623486395362446644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/3623486395362446644'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/09/finding-quizzes-in-play-quiz.html' title='Finding Quizzes in Play a Quiz'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-2WUsYu_L6sQ/TmYuG5wNYYI/AAAAAAAAAGQ/y0hFsQEgh9Q/s72-c/paq1.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-1131245934403508795</id><published>2011-09-05T12:51:00.000+01:00</published><updated>2011-09-05T12:51:59.931+01:00</updated><title type='text'>New weekly quiz on Toad for Oracle!</title><content type='html'>&lt;span class="st"&gt;Bob Marley tells us in &lt;a href="http://artists.letssingit.com/bob-marley-lyrics-coming-in-from-the-cold-wk5cmxp"&gt;Coming In From the Cold&lt;/a&gt;: "Why do you look so sad and foresaken / When &lt;i&gt;one &lt;br /&gt;
door&lt;/i&gt; is closed / Don't you know &lt;i&gt;another&lt;/i&gt; is &lt;i&gt;open.&lt;/i&gt;"&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class="st"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="st"&gt;OK, so summer is coming to an end.  And it &lt;i&gt;can&lt;/i&gt;  make us sad to think about colder weather (for those of us up north, anyway!) approaching. So, yes, the "door" of warmth and sun may be closing....but another  door at the PL/SQL Challenge is opening: a new quiz launches in September 2011: the Toad for Oracle Weekly Quiz!&lt;/span&gt;&lt;br /&gt;
&lt;h2&gt;&lt;/h2&gt;&lt;img src="http://www.oracleplsqlprogramming.com/newimg/Toad-Weekly-Quiz-banner.png" /&gt; &lt;br /&gt;
Starting on September 3, the PL/SQL Challenge will host a weekly quiz on &lt;a href="http://quest.com/toad-for-oracle" target="_blank"&gt;Toad for Oracle&lt;/a&gt;,  sponsored by Quest Software. Toad for Oracle is used by hundreds of thousands of Oracle technologists every day. Everyone has their favorite features and there's always more to learn about this incredibly useful tool. Now, you can test, &lt;br /&gt;
demonstrate and deepen your expertise in Toad for Oracle with the Weekly Toad  Quiz!&lt;br /&gt;
&lt;br /&gt;
Your answers will be ranked, based on correctness and time to answer. Top ranked players will be displayed at &lt;a href="http://toadworld.com/" target="_blank"&gt;ToadWorld&lt;/a&gt; and Quest will raffle off ebooks of the &lt;a href="http://oreilly.com/catalog/9780596514044" target="_blank"&gt;Oracle PL/SQL Language Pocket Reference&lt;/a&gt; from O'Reilly Media to all those who played the quiz that month.&lt;br /&gt;
&lt;br /&gt;
So if you are a Toad user, this is the perfect opportunity to show how well you know this tool, and learn more about what Toad for Oracle can do for you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-1131245934403508795?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/1131245934403508795/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/09/new-weekly-quiz-on-toad-for-oracle.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/1131245934403508795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/1131245934403508795'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/09/new-weekly-quiz-on-toad-for-oracle.html' title='New weekly quiz on Toad for Oracle!'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-7458251351636832393</id><published>2011-08-30T18:08:00.000+01:00</published><updated>2011-08-30T18:08:45.009+01:00</updated><title type='text'>Daily PL/SQL Quizzes between 22 August and 26 August</title><content type='html'>&lt;h3&gt;&lt;/h3&gt;Last week, 841 Oracle technologists submitted 2,548 answers to quizzes. Here are the PL/SQL quizzes played that week:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;22 August 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:PG_PQ_DRILLDOWN:2197809275067145::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:5203,5983&amp;amp;cs=1DD77B8EEE7C879E18A918A153E5DC2EC"&gt;	When you use the FOR UPDATE clause in your query, Oracle will lock all rows identified by the SELECT statement. When you specify columns with FOR UPDATE OF, locks will be placed only on rows in tables whose columns are in the list.&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;620 Players ♦ Avg. Correct: 79% ♦ Avg. Time: 325 seconds ♦ Rating: 4 stars&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;23 August 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:PG_PQ_DRILLDOWN:2197809275067145::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:5204,5984&amp;amp;cs=19ED7857D778766F7188C9AA282B4A166"&gt;	When writing a CASE statement, you should always include an ELSE clause - unless you are absolutely sure that one of the WHEN clauses will always evaluate to TRUE. That's a big assumption to make.&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;644 Players ♦ Avg. Correct: 54% ♦ Avg. Time: 110 seconds ♦ Rating: 4 stars&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;24 August 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:PG_PQ_DRILLDOWN:2197809275067145::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:5205,5985&amp;amp;cs=13594DCF2D6877062AE166DC392410C55"&gt;	When you initialize an object type instance, you must supply an expression for each attribute. When you initialize a nested table or varray, you do not need to supply any expressions (elements) for the array.&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;670 Players ♦ Avg. Correct: 75% ♦ Avg. Time: 335 seconds ♦ Rating: 4 stars&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;25 August 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:PG_PQ_DRILLDOWN:2197809275067145::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:5206,5986&amp;amp;cs=1A491A5808236CD353A5635B135C82D49"&gt;	Use TRUNC to remove the specified number of significant digits from a number. Use TRUNC, in particular, when you do not want rounding to be performed on the number.&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;661 Players ♦ Avg. Correct: 87% ♦ Avg. Time: 271 seconds ♦ Rating: 4 stars&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;26 August 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:PG_PQ_DRILLDOWN:2197809275067145::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:5207,5987&amp;amp;cs=1F74C48CFF65FF02A47F87CB1CF821CBD"&gt;	The value of the LAST_DDL_TIME column of the ALL_OBJECTS and USER_OBJECTS data dictionary views is updated whenever the object is changed (for example, when code is changed and then compiled). But this column value is &lt;i&gt;not&lt;/i&gt; changed if you replace a program and the code has not been modified.&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;627 Players ♦ Avg. Correct: 24% ♦ Avg. Time: 425 seconds ♦ Rating: 4 stars&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-7458251351636832393?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/7458251351636832393/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/08/daily-plsql-quizzes-between-22-august.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/7458251351636832393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/7458251351636832393'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/08/daily-plsql-quizzes-between-22-august.html' title='Daily PL/SQL Quizzes between 22 August and 26 August'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-9158975701648042016</id><published>2011-08-29T18:47:00.000+01:00</published><updated>2011-08-29T18:47:26.789+01:00</updated><title type='text'>Impact of NULLs and Analyzing Choice Correctness (5926)</title><content type='html'>The SQL quiz that started on 13 August has prompted a number of players to raise questions about the impact of NULL values (sorry about the delay in writing about this!). And, though it might seem odd, their comments also relate to how you should read, interpret and choose correct answers for our quizzes.&lt;br /&gt;
&lt;br /&gt;
The quiz asked the following question of the plch_employees table:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: blue;"&gt;We want to retrieve the total earnings (i.e. salary + commission) of an employee. Which queries give us the correct result?&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
The rows in the table included some NULL values for commission, while none of the salary values were NULL.&lt;br /&gt;
&lt;br /&gt;
Players questioned our scoring as correct &lt;i&gt;any &lt;/i&gt;of the choices, because all the queries assumed that the salary will never be NULL.&lt;br /&gt;
&lt;br /&gt;
I will make a few comments, and then invite both our SQL author/reviewers and players to offer their own perspectives.&amp;nbsp; My comments:&lt;br /&gt;
&lt;br /&gt;
1. It would have been better if we'd put a NOT NULL constraint on the employee_salary column. That would avoid the issue altogether (in fact, I plan to do this after we finish this discussion).&lt;br /&gt;
&lt;br /&gt;
2. It is important to draw a distinction between answering a quiz and developing "bullet-proof" code that handles all possible scenarios.&lt;br /&gt;
&lt;br /&gt;
When you take a quiz, you answer the question in the context of the information provided &lt;i&gt;in&lt;/i&gt; that question - and nothing else. In this case, none of the salaries were NULL and so the issue of the impact of NULL on a formula like "salary + commission" only affects the commission "side" of the formula.&lt;br /&gt;
&lt;br /&gt;
So I do not believe that any change in scoring needs to take place. But, as noted earlier, I do think we should add a NOT NULL constraint on the salary column.&lt;br /&gt;
&lt;br /&gt;
Your thoughts?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-9158975701648042016?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/9158975701648042016/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/08/impact-of-nulls-and-analyzing-choice.html#comment-form' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/9158975701648042016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/9158975701648042016'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/08/impact-of-nulls-and-analyzing-choice.html' title='Impact of NULLs and Analyzing Choice Correctness (5926)'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-7139193074505188032</id><published>2011-08-29T16:35:00.000+01:00</published><updated>2011-08-29T16:35:48.047+01:00</updated><title type='text'>PL/SQL Challenge upgrades to APEX 4.1</title><content type='html'>We upgraded the website to APEX 4.1 over the weekend. Overall, it went smoothly (thanks, John Scott of &lt;a href="http://apex-evangelists.com/"&gt;Apex Evangelists&lt;/a&gt;!). We had to upgrade some plug-ins, but that was easy enough.&lt;br /&gt;
&lt;br /&gt;
Two issues have caught our attention, though:&lt;br /&gt;
&lt;br /&gt;
1. It seems as though processing on the website has gotten noticeably slower in a few spots (I click on the Play Now button and wait 5-10 seconds to move to the quiz page (don't worry - this time is &lt;i&gt;not&lt;/i&gt; recorded as part of your answer time!). &lt;b&gt;Does anyone else see this happening?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
2. URLs with checksums generated by apex_util.prepare_url no longer seem to work; that is, even though the URLs include a checksum, you see this error:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;Session state protection violation: This may be caused by manual alteration of a  URL containing a checksum or by using a link with an incorrect or missing  checksum.&amp;nbsp;&lt;/div&gt;&lt;br /&gt;
The behavior on Firefox seems to be inconsistent. On Internet Explorer, though, the URLs are always failing and we just noticed that IE seems to be &lt;i&gt;changing&lt;/i&gt;the URL. That is, I paste in this URL into Firefox and it works fine:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:PG_PQ_DRILLDOWN:442439591002222::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:5207,5987&amp;amp;cs=1F74C48CFF65FF02A47F87CB1CF821CBD"&gt;http://plsqlchallenge.com/pls/apex/f?p=10000:PG_PQ_DRILLDOWN:442439591002222::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:5207,5987&amp;amp;cs=1F74C48CFF65FF02A47F87CB1CF821CBD&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
I then&amp;nbsp; paste it into IE8 and press enter, IE8 changes the url to:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.plsqlchallenge.com/pls/apex/f?p=10000:PG_PQ_DRILLDOWN:3106820171411144::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:5207,5987%26cs%3D1F74C48CFF65FF02A47F87CB1CF821CBD"&gt;http://www.plsqlchallenge.com/pls/apex/f?p=10000:PG_PQ_DRILLDOWN:3106820171411144::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:5207,5987%26cs%3D1F74C48CFF65FF02A47F87CB1CF821CBD&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Notice  that &amp;amp; is changed to %26. And then I see the checksum error.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Do you have any experience with this?&lt;br /&gt;
&lt;br /&gt;
Cheers, Steven Feuerstein&lt;br /&gt;
&lt;br /&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-7139193074505188032?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/7139193074505188032/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/08/plsql-challenge-upgrades-to-apex-41.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/7139193074505188032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/7139193074505188032'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/08/plsql-challenge-upgrades-to-apex-41.html' title='PL/SQL Challenge upgrades to APEX 4.1'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-4329412447482396718</id><published>2011-08-26T13:02:00.000+01:00</published><updated>2011-08-26T13:02:21.932+01:00</updated><title type='text'>One, Two, Many Implicit Conversions (5986)</title><content type='html'>A player brought to our attention some rather strange code in the 25 August quiz on TRUNC.&lt;br /&gt;
&lt;br /&gt;
We asked you to use this block to determine your answer:&lt;br /&gt;
&lt;pre&gt;DECLARE
   multiplier   INTEGER := /*VALUE*/;
BEGIN
   FOR indx IN 1 .. 5
   LOOP
      DBMS_OUTPUT.put_line (
            'Trunc by '
         || NVL (TO_CHAR (multiplier * indx), 'NULL')
         || ' = '
         || TO_NUMBER (TRUNC (123456.123456, multiplier * indx)));
   END LOOP;
END;&lt;/pre&gt;And this is what he wrote:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;"I just hope your construct is meant to illustrate "bad practice"? You have this line: "|| TO_NUMBER (TRUNC (123456.123456, multiplier * indx))". You are doing TO_NUMBER on a number which will implicitly convert the result of TRUNC to a string, which TO_NUMBER converts back. Then the result of TO_NUMBER is a number which you are concatenating to your output string, so that must also be an implicit conversion? Have I read it correctly or am I just not awake yet  ? I guess it might be meant as a distraction or a way to force ORA-06502? Anyway - you may have your reasons, I just wanted to let you know in case it happened to be a typo and you meant TO_CHAR instead of TO_NUMBER..."&lt;/div&gt;&lt;br /&gt;
Well, I must admit: that was a typo. And a &lt;i&gt;lucky&lt;/i&gt; typo....it did not affect the outcome of the quiz, because Oracle ending up "doing the right thing" for us through implicit conversions. &lt;br /&gt;
&lt;br /&gt;
So I am going to change the quiz to use TO_CHAR. Thanks for pointing this out, Kim!&lt;br /&gt;
&lt;br /&gt;
SF&lt;br /&gt;
&lt;br /&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-4329412447482396718?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/4329412447482396718/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/08/one-two-many-implicit-conversions-5986.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/4329412447482396718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/4329412447482396718'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/08/one-two-many-implicit-conversions-5986.html' title='One, Two, Many Implicit Conversions (5986)'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-7054508012338133270</id><published>2011-08-24T13:15:00.000+01:00</published><updated>2011-08-24T13:15:44.971+01:00</updated><title type='text'>APEX Support in Toad</title><content type='html'>&lt;br /&gt;
Quest is exploring whether to and how best to add support for Oracle Application Express in Toad for Oracle. &lt;br /&gt;
&lt;br /&gt;
More and more Oracle technologists are building websites in APEX technology. It is moving rapidly from the sidelines of departmental applications to the mainstream of robust, public and private websites implementing mission critical applications involving many users. For example, the PL/SQL Challenge website is built on APEX.&lt;br /&gt;
&lt;br /&gt;
Hundreds of thousands of these same technologists also spend lots of their time in Toad for Oracle, building out the backend elements (tables, packages, etc.). Quest Software believes that Toad for Oracle should be able to help APEX developers understand, analyze, maintain and even enhance their applications from within Toad.&lt;br /&gt;
&lt;br /&gt;
We also, realize, however, that there is an enormous range and depth of experience with APEX "out there." So rather than just come up with a list of features we think would be helpful to APEX developers, we'd like to hear from you, the APEX developer and also development DBAs supporting APEX developers, about how you think Toad for Oracle can best support your work with APEX.&lt;br /&gt;
&lt;br /&gt;
You can do so by responding to this blog post. You can also email me directly at steven.feuerstein@quest.com. I will be compiling requests and requirements for consideration by the Toad for Oracle Product Manager and development team.&lt;br /&gt;
&lt;br /&gt;
Many thanks in advance,&lt;br /&gt;
Steven Feuerstein&lt;br /&gt;
PL/SQL Evangelist, Quest Software&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-7054508012338133270?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/7054508012338133270/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/08/apex-support-in-toad.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/7054508012338133270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/7054508012338133270'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/08/apex-support-in-toad.html' title='APEX Support in Toad'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-6213369295210391954</id><published>2011-08-23T15:19:00.000+01:00</published><updated>2011-08-23T15:19:05.092+01:00</updated><title type='text'>Daily Quiz Activity for 15 August 2011 - 19 August 2011</title><content type='html'>In the past week (15 August - 19 August), 790 Oracle technologists were busy submitting 2,376 answers to quizzes and exploring the library of past quizzes. Here are the PL/SQL quizzes played in that period:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;15 August 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:PG_PQ_DRILLDOWN:3110876066541454::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:5198,5978&amp;amp;cs=1CC1D653C730C9A29E37C5424EB41EC2E"&gt;	When you want to declare an associative array with an integer index, the datatype of the INDEX BY clause must be BINARY_INTEGER or any of its subtypes. You should, as a rule, always use PLS_INTEGER unless you have some specialized requirement.&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;528 Players ♦ Avg. Correct: 64% ♦ Avg. Time: 221 seconds ♦ Rating: 4 stars&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;16 August 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:PG_PQ_DRILLDOWN:3110876066541454::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:5199,5979&amp;amp;cs=1E85B2AEDFC2C967721313A2FC3047AC4"&gt;	Make sure that you are both aware of all possible built-in functions and that you use them in a way that optimizes both performance and maintainability.&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;634 Players ♦ Avg. Correct: 73% ♦ Avg. Time: 444 seconds ♦ Rating: 4 stars&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;17 August 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:PG_PQ_DRILLDOWN:3110876066541454::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:5200,5980&amp;amp;cs=1FE144F5CD18748D7D61CD55EC6F79637"&gt;	ALL_PROCEDURES gives you information about the subprograms (procedures and functions, both schema-level and within packages) on which you have EXECUTE authority.&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;633 Players ♦ Avg. Correct: 80% ♦ Avg. Time: 203 seconds ♦ Rating: 4 stars&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;18 August 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:PG_PQ_DRILLDOWN:3110876066541454::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:5201,5981&amp;amp;cs=1F8AF5A6605541BF9CD374B176FD02FD5"&gt;	Use SAVEPOINT to define a point in your session's transaction to which you can rollback. This feature allows you to only partially rollback changes in your session.&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;624 Players ♦ Avg. Correct: 70% ♦ Avg. Time: 273 seconds ♦ Rating: 4 stars&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;19 August 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:PG_PQ_DRILLDOWN:3110876066541454::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:5202,5982&amp;amp;cs=1FB580EF56ED5A59A468A1B532C44BBA5"&gt;	You can compare a collection to NULL, but keep in mind that associative arrays will always evaluate to NOT NULL - even if they do not contain any data. Nested tables and varrays are NULL until initialized.&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;591 Players ♦ Avg. Correct: 68% ♦ Avg. Time: 213 seconds ♦ Rating: 4 stars&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-6213369295210391954?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/6213369295210391954/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/08/daily-quiz-activity-for-15-august-2011.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/6213369295210391954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/6213369295210391954'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/08/daily-quiz-activity-for-15-august-2011.html' title='Daily Quiz Activity for 15 August 2011 - 19 August 2011'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-1686292390440097009</id><published>2011-08-18T14:40:00.000+01:00</published><updated>2011-08-18T14:40:01.236+01:00</updated><title type='text'>ALL_PROCEDURES Evolves Over Versions (5980)</title><content type='html'>The 17 August quiz tested your knowledge of the ALL_PROCEDURES view. Several players objected to the scoring of the following choice as correct:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;The program type in the view contains the type of the schema-level unit, not the type of the subprogram in the package.&lt;/div&gt;&lt;br /&gt;
Objections centered on two issues:&lt;br /&gt;
&lt;br /&gt;
1. There is no "program type" in the view. There is only an OBJECT_TYPE column (and that, only in Oracle Database 11; more on that in point 2). As players wrote:&lt;span style="color: blue;"&gt; "As far as I was concerned, there was no "program type" in the view therefore  incorrect. More so given that it's not only functions, procedures and packages,  but types and triggers. It's object type. Petty perhaps? That was how I read  it."&lt;/span&gt; and &lt;span style="color: blue;"&gt;"It makes it hard when the question makes up its own terminology for columns in  the data dictionary views. I've always called it "object type" because that's  the column name, consistent with many other data dictionary views."&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
2. The OBJECT_TYPE column was only added in Oracle Database 11, yet this quiz stated that 10.2 was the minimum version for which the quiz was valid.&lt;br /&gt;
&lt;br /&gt;
Yes, this is certainly true as you can see from the SQL*Plus session below:&lt;br /&gt;
&lt;pre&gt;SQL&amp;gt; select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE    10.2.0.1.0      Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production

SQL&amp;gt; desc all_procedures

Name                                      Null?    Type
----------------------------------------- -------- ------------
OWNER                                     NOT NULL VARCHAR2(30)
OBJECT_NAME                               NOT NULL VARCHAR2(30)
PROCEDURE_NAME                                     VARCHAR2(30)
AGGREGATE                                          VARCHAR2(3)
PIPELINED                                          VARCHAR2(3)
IMPLTYPEOWNER                                      VARCHAR2(30)
IMPLTYPENAME                                       VARCHAR2(30)
PARALLEL                                           VARCHAR2(3)
INTERFACE                                          VARCHAR2(3)
DETERMINISTIC                                      VARCHAR2(3)
AUTHID                                             VARCHAR2(12)
&lt;/pre&gt;A correction will be needed.&lt;br /&gt;
&lt;br /&gt;
Other players took issue with scoring the following choice as correct:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: blue;"&gt;You can use this view to determine which of your subprograms are declared as deterministic.&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
If you simply check the documentation on ALL_PROCEDURES, then for some 10.2 versions of that doc, you will&lt;i&gt; not&lt;/i&gt; see a mention of the DETERMINISTIC column. That column is, however, present in all releases of 10.2.&lt;br /&gt;
&lt;br /&gt;
As one player noted, "I would like to solve quizzes where answers is possible to find in Oracle  documentation. For instance for this quiz Oracle 10.2 documentation about  ALL_PROCEDURES is incomplete."&lt;br /&gt;
&lt;br /&gt;
I can certainly understand why a player might like us to do this, but the PL/SQL Challenge quizzes will not be constrained to the limitations of the  Oracle documentation....that would make them of much less use to PL/SQL  developers. We have to live in and program in the "real world", not the  world presented in the documentation!&lt;br /&gt;
&lt;br /&gt;
So to conclude: &lt;br /&gt;
&lt;ul&gt;&lt;li&gt;I will change the minimum version of this quiz to Oracle Database 11g.&lt;/li&gt;
&lt;li&gt;I will clean up the choice regarding "program type" to be more explicit about the column. &lt;/li&gt;
&lt;li&gt;All players will receive credit for a correct selection for the "program type" choice.&lt;/li&gt;
&lt;/ul&gt;Did I miss anything? :-) &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-1686292390440097009?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/1686292390440097009/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/08/allprocedures-evolves-over-versions.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/1686292390440097009'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/1686292390440097009'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/08/allprocedures-evolves-over-versions.html' title='ALL_PROCEDURES Evolves Over Versions (5980)'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-1756968455203795590</id><published>2011-08-17T01:35:00.000+01:00</published><updated>2011-08-17T01:35:37.045+01:00</updated><title type='text'>Finding Holes in Algorithms - "Number in String" (5979)</title><content type='html'>The 16 August quiz stated the following:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;I need to write a function named plch_num_instr that returns the number  of times a substring occurs within a string. Here is the header of the  function:&lt;/div&gt;&lt;pre style="color: blue;"&gt;FUNCTION plch_num_instr (
   string_in IN VARCHAR2, substring_in IN VARCHAR2)&lt;/pre&gt;We then asked you: &lt;br /&gt;
&lt;br /&gt;
"Which of the choices implement plch_num_instr so that the following block displays these five lines after execution..."&lt;br /&gt;
&lt;br /&gt;
One player wrote after taking this quiz:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;"Fine quiz but I think that none of the solutions would correctly implement your  requirement (although I found the three correct answers for the quiz). Just try  "plch_num_instr( 'Steieimer Meieieier', 'eiei')". The correct answer is 3 but  all of your solutions just return 2 (haven't tried it before, but I have thought  that the RegExp_Count() should return the correct value). The error lies in the  implementation of the answer with id 7628 where you add the length of the  substring to the actual starting position instead of adding just 1. This is no  request for a scoring adjustment just a little bit to think about."&amp;nbsp; He also offered a corrected implementation, which you will find at the end of this posting.&lt;/div&gt;&lt;br /&gt;
And another player wrote with a similar concern: &lt;span style="color: blue;"&gt;"In the given function calls, it give us correct answers, but there are cases when  this implementation returns incorrect answer. For example: plch_num_instr  ('123123123123', '123123'). Call to this implementation will return 2, but  substring '123123' occurs 3 times within a string."&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
And finally as one player so succinctly expressed it: &lt;span style="color: blue;"&gt;"Just out of interest, given this specification what should the following block display? &lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;BEGIN DBMS_OUTPUT.put_line (plch_num_instr ('steeeeeeven', 'ee'));  END;&lt;/span&gt;&lt;/span&gt;"&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
All players are correct; the choices did not contain an implementation that handled &lt;i&gt;all&lt;/i&gt; cases (nor did we claim that they would). I will add the implementation you see below to the answer, along with the points noted above. But no change will be made in scoring.&lt;br /&gt;
&lt;pre&gt;CREATE OR REPLACE
FUNCTION InStrCount (pString  IN VARCHAR2,
                     pSearch  IN VARCHAR2)
                    RETURN BINARY_INTEGER
/*====================================================================
    Returns the number of occurrences of a search-string in a string
  --------------------------------------------------------------------
    pString:  String to search for the occurrences of "pSearch"
    pSearch:  String to search in "pString"
  --------------------------------------------------------------------
    Result:  number of occurrences of "pSearch" in "pString"
  --------------------------------------------------------------------
    History:  000-00  nhecker
  ====================================================================*/
IS

    Result  BINARY_INTEGER := 0;
    iPos    BINARY_INTEGER;
    iStart  BINARY_INTEGER := 1;

BEGIN
  LOOP
    iPos := InStr( pString, pSearch, iStart);
    EXIT WHEN (iPos = 0);

    Result := Result + 1;
    iStart := iPos + 1;
  END LOOP;
  RETURN (Result);
END InStrCount;
/
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-1756968455203795590?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/1756968455203795590/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/08/finding-holes-in-algorithms-number-in.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/1756968455203795590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/1756968455203795590'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/08/finding-holes-in-algorithms-number-in.html' title='Finding Holes in Algorithms - &quot;Number in String&quot; (5979)'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-4155227786893485075</id><published>2011-08-15T12:53:00.001+01:00</published><updated>2011-08-15T12:53:49.910+01:00</updated><title type='text'>Last week in the Oracle PL/SQL Challenge Daily Quiz</title><content type='html'>&lt;h3&gt;&lt;/h3&gt;In the past week (8 August - 12 August), 866 Oracle technologists were busy answering quizzes (over 2,600 answers wee submitted) and exploring the library of past quizzes. Here are the PL/SQL daily quizzes played in that period:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;8 August 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:PG_PQ_DRILLDOWN:3982386058635954::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:4410,5190&amp;amp;cs=1354C2E14CA13D01852F754732965232B"&gt;	In both SQL and PL/SQL, Oracle supports two "wildcard" characters:&amp;nbsp; "%" (percent sign) and "_" (underscore). You can use wildcard characters in LIKE conditions to look for matches on patterns in strings.&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;633 Players ♦ Avg. Correct: 82% ♦ Avg. Time: 103 seconds ♦ Rating: 4 stars&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;9 August 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:PG_PQ_DRILLDOWN:3982386058635954::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:4411,5191&amp;amp;cs=1A241CA87EF85789DB8E13FEC9E39A306"&gt;	Prior to Oracle 11g, you could not directly reference fields of records in the binding array of FORALL. You would instead have to "break out" a collection of records into individual collections for each column to be updated or compared in the SQL statement; you could also update or insert entire records. In Oracle 11g, you can now reference those fields.&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;685 Players ♦ Avg. Correct: 52% ♦ Avg. Time: 238 seconds ♦ Rating: 4 stars&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;10 August 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:PG_PQ_DRILLDOWN:3982386058635954::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:4412,5192&amp;amp;cs=17A1DF14E82D9A8605D95F8DD52FBC54F"&gt;	Make certain that whenever you are implementing any sort of increment or counter that the initial value is not NULL - and is not set to NULL along the way.&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;672 Players ♦ Avg. Correct: 81% ♦ Avg. Time: 209 seconds ♦ Rating: 4 stars&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;11 August 2011: &lt;/b&gt;&lt;a href="http://plsqlchallenge.com/pls/apex/f?p=10000:PG_PQ_DRILLDOWN:3982386058635954::NO:651:P651_COMP_EVENT_ID,P651_QUIZ_ID:4413,5193&amp;amp;cs=1554EF48756D8257D034C2DEAFD20CBA3"&gt;	Packages that contain package-level data may cause ORA-04068 errors if the package body is recompiled. You can avoid this problem by declaring your package to be serially reusable, by moving the package-level data out of that package or, with 11.2 and higher, by using the Edition Based Redefinition feature.&lt;/a&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;667 Players ♦ Avg. Correct: 57% ♦ Avg. Time: 309 seconds ♦ Rating: 4 stars&lt;br /&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-4155227786893485075?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/4155227786893485075/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/08/last-week-in-oracle-plsql-challenge.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/4155227786893485075'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/4155227786893485075'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/08/last-week-in-oracle-plsql-challenge.html' title='Last week in the Oracle PL/SQL Challenge Daily Quiz'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-6832904709709263600</id><published>2011-08-12T17:51:00.000+01:00</published><updated>2011-08-12T17:51:57.260+01:00</updated><title type='text'>Wrong Scoring for Stateful Package Quiz? (5193)</title><content type='html'>The 11 August quiz explored the concept of "state" in a package and asked you to identify ways to avoid the raising of the ORA-04068 error.&lt;br /&gt;
&lt;br /&gt;
Two players wrote with objections to how the answers were scored. Here are their comments:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;I guess answer 7626 was supposed to be correct, but the offered solution will  not work. The new package body should reference the variable declared in  plch_pkg_constant: CREATE OR REPLACE PACKAGE BODY plch_pkg IS FUNCTION  language_vendor RETURN VARCHAR2 IS BEGIN RETURN plch_pkg_constant.g_language; --  &amp;lt;== END language_vendor; END plch_pkg; So "Move the declaration of the  variable to another package" is correct, but "as shown below" is not.&amp;nbsp;&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="color: blue;"&gt;My reading of the choices is that none of them will give you the response of the  "newly changed variable", however my feeling that the "Move the variable to the  package" is the correct choice because, I am thinking, that that will allow you  to repeatedly call the function even though the response will always be "Oracle  Corporation" and not what you set the variable to.&amp;nbsp;&lt;/div&gt;&lt;br /&gt;
My response: I can see why these players were caught up on this issue, but I believe it results from a mis-reading of the quiz question, which ends with:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: #4c1130;"&gt;"Which of the choices describe a way to change the code in plch_pkg so  that a user connected to the SCOTT schema can call the  hr.plch_pkg.language_vendor function repeatedly, even if the default  value of the g_language variable is changed in the HR schema?"&lt;/div&gt;&lt;br /&gt;
Notice that I say "call the  hr.plch_pkg.language_vendor function repeatedly". The g_language variable (which gives "state" to the package, leading to the ORA-04068 error) is not used by the language_vendor function. Changing the value of this variable does not affect this function in any way. So I don't think this statement is true: "The new package body should reference the variable declared in  plch_pkg_constant."&lt;br /&gt;
&lt;br /&gt;
Of course, in the "real world", it is unlikely that you can move a variable from one package to another &lt;i&gt;without &lt;/i&gt;having a ripple effect through other subprograms and program units. But I don't think that is an issue here.&lt;br /&gt;
&lt;br /&gt;
Your thoughts? &lt;br /&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-6832904709709263600?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/6832904709709263600/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/08/wrong-scoring-for-stateful-package-quiz.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/6832904709709263600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/6832904709709263600'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/08/wrong-scoring-for-stateful-package-quiz.html' title='Wrong Scoring for Stateful Package Quiz? (5193)'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-2282136359385054739</id><published>2011-08-10T18:37:00.000+01:00</published><updated>2011-08-10T18:37:27.753+01:00</updated><title type='text'>FORALL, UPDATE and Reality-Doc Conflicts (6431)</title><content type='html'>The 9 August quiz tested your knowledge of the restriction (prior to Oracle 11g) that you cannot reference fields of collections of records in a FORALL statement. The FORALL statement we showed in the question is this:&lt;br /&gt;
&lt;pre&gt;FORALL i IN 1 .. l_tab.COUNT
      UPDATE plch_employees
         SET salary = l_tab (i).salary * 1.1
       WHERE employee_id = l_tab (i).employee_id;
&lt;/pre&gt;Notice that the same collection (l_tab) is referenced in both the SET and WHERE clauses.&lt;br /&gt;
&lt;br /&gt;
A player who pays close attention to the Oracle documentation wrote as follows:&lt;br /&gt;
&lt;br /&gt;
For both 11.1 and 11.2, the "PL/SQL Language Reference" documentations  (as PDF, for 11.1 page 13-59, for 11.2 page 13-79) states the following: "If dml_statement is an UPDATE statement, its SET and  WHERE clauses cannot reference the same collection."&lt;br /&gt;
&lt;br /&gt;
Well, I must admit, this was news to me. I'd never noticed that restriction and, it turns out, for a fairly good reason: neither the PL/SQL compiler nor run-time engine complains about this scenario at all. &lt;br /&gt;
&lt;br /&gt;
So is the documentation correct or is the functionality of PL/SQL correct? I asked Bryn Llewellyn, PL/SQL Product Manager. Here is his reply:&lt;br /&gt;
&lt;br /&gt;
"I  agree that it [my demonstration code] does seem to be at odds with the claim from the docs that you  quote. 'll have to ask about this and get back to you."&lt;br /&gt;
&lt;br /&gt;
Bryn also provided a script (see below) that he is using to reproduce the issue.&lt;br /&gt;
&lt;br /&gt;
Needless to say, I do not plan to change the scoring of the question! &lt;br /&gt;
&lt;pre&gt;CLEAR SCREEN
CONNECT Sys/Sys AS SYSDBA
declare
  procedure Create_User(Who in varchar2) is
    User_Does_Not_Exist exception;
    pragma Exception_Init(User_Does_Not_Exist, -01918);
  begin
    begin
      execute immediate 'drop user Usr cascade';
    exception when User_Does_Not_Exist then null; end;
    execute immediate '
      grant
        Unlimited Tablespace,
        Create Session,
        Create Table,
        Create Trigger
      to Usr identified by p';
  end Create_User; 
begin
  Create_User('Usr');
end;
/
CONNECT Usr/p
create table t(ID integer primary key, c1 varchar2(10), c2 number)
/
begin
  insert into t values(1, 'a', 10);
  insert into t values(2, 'b', 10);
  insert into t values(3, 'c', 30);
  commit;
end;
/
select ID, c1, c2 from t
/
declare
  type x is table of number;
  v x;
begin
  select c2
  bulk collect into v
  from t
  for update;

  forall i in 1..v.Count()
  update t
  set c2 = v(i)*2
  where c2 = v(i);
end;
/
select ID, c1, c2 from t
/

&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-2282136359385054739?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/2282136359385054739/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/08/forall-update-and-reality-doc-conflicts.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/2282136359385054739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/2282136359385054739'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/08/forall-update-and-reality-doc-conflicts.html' title='FORALL, UPDATE and Reality-Doc Conflicts (6431)'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-7335216630448158554</id><published>2011-08-05T20:12:00.000+01:00</published><updated>2011-08-05T20:12:32.482+01:00</updated><title type='text'>Is typing and running code a form of cheating?</title><content type='html'>I received this email from a player today:&lt;br /&gt;
&lt;div style="color: blue;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="color: blue;"&gt;Is it okay to use sqlplus at all while taking a quiz? I know reading oracle  documentation is acceptable, and typing the quiz in sqlplus verbatim is not  allowed, but are we allowed to test basic concepts in sqlplus at all? I have  been assuming it is not allowed. For example, I wasn't sure if IS OF type  returned true if the value of the variable was the type or if the variable was  the type. The documentation isn't always clear. If I was allowed to use sqlplus,  I would have tested out a few statements to verify the expected outcome of that  statement.&amp;nbsp;&lt;/div&gt;&lt;br /&gt;
The answer is: it is perfectly all right to use SQL*Plus, Toad, SQL Developer, PL/SQL Developer, etc. to write and execute code to help you answer the quiz.&lt;br /&gt;
&lt;br /&gt;
You should not (and, in fact, you should not be &lt;i&gt;able&lt;/i&gt; to) copy and paste code from a quiz, and then simply execute it. But as I note, you should not be able to do this; most quizzes present code as an image. If the code is accessible for copying, then it is not (or, shall I say, &lt;i&gt;should&lt;/i&gt; not be) a competitive quiz (rankings and prizes) and we don't really care if you copy and paste.&lt;br /&gt;
&lt;br /&gt;
But if you want to take the time to type in a block of code (or more), then execute that code to see the results, please go right ahead. The most important objective of the PL/SQL Challenge is to improve your knowledge of PL/SQL (and SQL and APEX and....). I can think of few better ways to do this then to &lt;i&gt;write code.&amp;nbsp; &lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
You will, of course, be "penalized" for taking the time to write code; your score will be reduced by the extra time required to do so. But it is definitely &lt;i&gt;not&lt;/i&gt; cheating.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-7335216630448158554?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/7335216630448158554/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/08/is-typing-and-running-code-form-of.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/7335216630448158554'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/7335216630448158554'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/08/is-typing-and-running-code-form-of.html' title='Is typing and running code a form of cheating?'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-6803985234584714937</id><published>2011-08-04T12:20:00.000+01:00</published><updated>2011-08-04T12:20:04.386+01:00</updated><title type='text'>NLS Settings and Assumptions - Be Careful! (5187)</title><content type='html'>The 3 August quiz tested your knowledge of the way that Oracle performs implicit conversions, in particular in this block:&lt;br /&gt;
&lt;pre&gt;DECLARE
   n   NUMBER;
BEGIN
   n := '123.456' || 900;
   DBMS_OUTPUT.put_line ('X' || n || 'X');
END;
/&lt;/pre&gt;We reported the correct answer as:&lt;br /&gt;
&lt;pre&gt;X123.4569X
&lt;/pre&gt;But several players wrote to say that when they tested our answers with the verification code, they received the following error:&lt;br /&gt;
&lt;pre&gt;ORA-06502: PL/SQL: numeric or value error: character to number conversion error
&lt;/pre&gt;So did we score this quiz improperly? Another player offered an explanation:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: blue;"&gt;Hi, stupid me... A quick test for yesterdays quiz resulted in "ORA-06502:  PL/SQL: numeric or value error: character to number conversion error". And  that's the answer I gave for the quiz. Today I received the results and it seems  I got it wrong... Of course I got it wrong...I live not in America, so the NLS  setting were not set accordingly. I know they are in the assumptions, but after  100 quizes of not needing them, they'll get out of your mind&lt;/span&gt;.&lt;br /&gt;
&lt;br /&gt;
And that is precisely why the error was not raised in the verification code and why the quiz was scored correctly. The assumptions state that:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;&lt;/div&gt;&lt;div style="color: blue;"&gt;The following  calls to DBMS_SESSION.SET_NLS define national settings in effect for a  quiz, unless otherwise specified in the quiz. If your local environment  uses different settings, you may execute these statements to ensure  compatibility with behavior and output of executable code provided by  the PL/SQL Challenge.&lt;br /&gt;
&lt;br /&gt;
DBMS_SESSION.SET_NLS ('NLS_LANGUAGE' ,'AMERICAN');&lt;br /&gt;
DBMS_SESSION.SET_NLS ('NLS_TERRITORY','AMERICA');&lt;br /&gt;
DBMS_SESSION.SET_NLS ('NLS_CALENDAR' ,'Gregorian');&amp;nbsp;&lt;/div&gt;&lt;br /&gt;
This player also offered the following suggestion:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;Is it a good idea when asking a question depending to NLS settings, to repeat  this in the question(So people who want to test it and not living in the US  aren't disadvantaged)? Just an idea.&lt;/div&gt;&lt;br /&gt;
That &lt;i&gt;is&lt;/i&gt; a good idea and we will strive to remember to do this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-6803985234584714937?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/6803985234584714937/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/08/nls-settings-and-assumptions-be-careful.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/6803985234584714937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/6803985234584714937'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/08/nls-settings-and-assumptions-be-careful.html' title='NLS Settings and Assumptions - Be Careful! (5187)'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-1346721490760480360</id><published>2011-08-03T15:44:00.000+01:00</published><updated>2011-08-03T15:44:11.506+01:00</updated><title type='text'>Public Profile Settings for Your PL/SQL Challenge Account</title><content type='html'>A player wrote to us today:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;I completed every daily PL/SQL challenge (as well as every Weekly SQL quiz) in  July, 2011. Yet I did not receive the Achievement, "All Quizzes Taken in July  2011 (PL/SQL Challenge)" on my profile. Yet I notice that others have received  this achievement. Please rectify. (Note: I did not take any of the APEX or Logic  quizzes.) Thanks; your site is great.&lt;/div&gt;&lt;br /&gt;
I checked his public profile and found that he had not enabled the display of achievements. Now his accomplishment is visible to anyone who checks out his profile. And that reminded me that I should remind all of you:&lt;br /&gt;
&lt;br /&gt;
While you can register by providing the absolute minimum of information, we allow you to set up your profile so that you display your technical experience, professional achievements, recommendations to others, and more. You also have complete control over what information is displayed and what is not.&lt;br /&gt;
&lt;br /&gt;
I strongly encourage you to take a few minutes to visit your Account page, enter this information, and then click on the Public Profile Settings to ensure that others can what you have entered:&lt;br /&gt;
&lt;br /&gt;
&lt;img alt="" height="196" src="data:image/png;base64,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" width="640" /&gt;&lt;br /&gt;
You can then decide which of the information from your profile you want to make public:&lt;br /&gt;
&lt;img alt="" height="400" src="data:image/png;base64,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" width="396" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-1346721490760480360?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/1346721490760480360/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/08/public-profile-settings-for-your-plsql.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/1346721490760480360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/1346721490760480360'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/08/public-profile-settings-for-your-plsql.html' title='Public Profile Settings for Your PL/SQL Challenge Account'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-5313459370417083122</id><published>2011-08-01T12:23:00.001+01:00</published><updated>2011-08-01T12:23:37.702+01:00</updated><title type='text'>New Oracle Magazine Quiz Starts Today!</title><content type='html'>Today marks the start of a new quiz at the PL/SQL Challenge: the &lt;span style="color: blue;"&gt;Oracle Magazine PL/SQL quiz&lt;/span&gt;. I write a column for &lt;a href="http://www.oracle.com/us/sun/magazines/index.html"&gt;Oracle Magazine&lt;/a&gt; and two issues ago, I started a series of articles that introduce PL/SQL to those who are just entering the world of the Oracle Database.&lt;br /&gt;
&lt;br /&gt;
And starting with the Sept/Oct 2011 issue, we are including quiz questions within the article, which can also be answered at the PL/SQL Challenge site.&lt;br /&gt;
&lt;br /&gt;
Of course, you don't need to read the article to take the quiz, but we hope you will do so.&lt;br /&gt;
&lt;br /&gt;
One player has already submitted a question about this quiz, asking: "The Oracle Magazine quiz ends in 1613 days? Seriously?"&lt;br /&gt;
&lt;br /&gt;
Yes, seriously.&amp;nbsp; Each issue of Oracle Magazine has a "shelf life" of two-three months  (before the next issue comes out), but the magazine is also available  online. I know from experience that many Oracle technologists read these  articles well into the future.&lt;br /&gt;
&lt;br /&gt;
As a result, one way in which the Oracle Magazine PL/SQL quiz is different from others is that it will stay open for a really long time - until &lt;span class="display_only" id="P2020_END_DATE"&gt;31 December 2015. &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
But we will be selecting raffle winners randomly from all players, well before that, and likely more than once.&lt;br /&gt;
&lt;br /&gt;
Enjoy!&lt;br /&gt;
Steven Feuerstein&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-5313459370417083122?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/5313459370417083122/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/08/new-oracle-magazine-quiz-starts-today.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/5313459370417083122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/5313459370417083122'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/08/new-oracle-magazine-quiz-starts-today.html' title='New Oracle Magazine Quiz Starts Today!'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-7274737588629924383</id><published>2011-07-28T15:29:00.000+01:00</published><updated>2011-07-28T15:29:03.783+01:00</updated><title type='text'>Passing non-numeric strings to number arguments (4507)</title><content type='html'>The 27 July quiz asked the following:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: blue;"&gt;I create the following function in my schema:&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;br /&gt;
&lt;pre style="color: blue;"&gt;CREATE OR REPLACE FUNCTION plch_num_diff (number_in IN NUMBER)
   RETURN PLS_INTEGER
IS
BEGIN
   RETURN CEIL (number_in) - FLOOR (number_in);
END;
/&lt;/pre&gt;&lt;span style="color: blue;"&gt; &lt;/span&gt;&lt;br /&gt;
&lt;div style="color: blue;"&gt;Assuming that the value passed for number_in to this function is never  NULL, which of the statements about this function are true?&lt;/div&gt;&lt;br /&gt;
A player wrote with the following objection:&amp;nbsp; "I think this question is ambiguous. It is not clear about the scenario where a user  passes a non-number value into the function."&lt;br /&gt;
&lt;br /&gt;
I don't think this is a valid objection for this quiz because if you pass a string that cannot be implicitly converted into a number for the argument to plch_num_diff, the function will &lt;i&gt;not be run&lt;/i&gt;. Instead, Oracle will raise a VALUE_ERROR exception when it attempts the conversion (and before the function itself is executed).&lt;br /&gt;
&lt;br /&gt;
This can be demonstrated as follows: I try to call plch_num_diff with an argument value of 'abc'. Then I trap any exception and display the error message and backtrace.&lt;br /&gt;
&lt;pre&gt;DECLARE
   l_value   NUMBER;
BEGIN
   l_value := plch_num_diff ('abc');
EXCEPTION
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.put_line (sys.DBMS_UTILITY.format_error_stack);
      DBMS_OUTPUT.put_line (sys.DBMS_UTILITY.format_error_backtrace);
END;
/
&lt;/pre&gt;Here's the output I see:&lt;br /&gt;
&lt;pre&gt;ORA-06502: PL/SQL: numeric or value error: character to number conversion error

ORA-06512: at line 4
&lt;/pre&gt;Notice that the backtrace does not show an error raised &lt;i&gt;inside&lt;/i&gt; the function. Contrast that to the output from the following statements. I now raise an exception insde plch_num_diff and pass it a valid numeric value. &lt;br /&gt;
&lt;pre&gt;CREATE OR REPLACE FUNCTION plch_num_diff (number_in IN NUMBER)
   RETURN PLS_INTEGER
IS
BEGIN
   RAISE VALUE_ERROR;
   RETURN CEIL (number_in) - FLOOR (number_in);
END;
/

DECLARE
   l_value   NUMBER;
BEGIN
   l_value := plch_num_diff (1);
EXCEPTION
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.put_line (sys.DBMS_UTILITY.format_error_stack);
      DBMS_OUTPUT.put_line (sys.DBMS_UTILITY.format_error_backtrace);
END;
/
&lt;/pre&gt;And now I see the following output, indicating that the error was raised within the function:&lt;br /&gt;
&lt;pre&gt;ORA-06502: PL/SQL: numeric or value error

ORA-06512: at "HR.PLCH_NUM_DIFF", line 5
ORA-06512: at line 4
&lt;/pre&gt;I therefore conclude that the behavior of PL/SQL in a block invoking plch_num_diff has nothing to do with the functionality of the function itself, which was the focus of the quiz.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-7274737588629924383?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/7274737588629924383/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/07/passing-non-numeric-strings-to-number.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/7274737588629924383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/7274737588629924383'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/07/passing-non-numeric-strings-to-number.html' title='Passing non-numeric strings to number arguments (4507)'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-1874914522674485024</id><published>2011-07-27T19:37:00.001+01:00</published><updated>2011-08-05T17:22:41.362+01:00</updated><title type='text'>Q2 2011 Championship Playoff Results</title><content type='html'>You will find below the results of the Q2 2011 championship playoff.  You can take a look at the quizzes that were in the competition through  the Library page. These results will also be available through the Rankings  page.&lt;br /&gt;
&lt;br /&gt;
Congratulations to all players, of course, but let's give a special round of applause to our top three players:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt; Gary Myers (#1), who also ranked #2 in the &lt;i&gt;last&lt;/i&gt;  playoff and who wins a US$250 Amazon.com gift card. His first place ranking is especially impressive given the short time Gary took to answer the questions.&lt;/li&gt;
&lt;li&gt;Chris Saxon (#2),  who wins a US$175 Amazon.com gift card&lt;/li&gt;
&lt;li&gt;João Barreto (#3),  who wins a US$100 Amazon.com gift card&lt;/li&gt;
&lt;/ul&gt;Good luck to everyone in the quizzes for Q3 2011 - I hope to see you in the next playoff!&lt;br /&gt;
&lt;br /&gt;
&lt;table style="border-collapse: collapse; border: 1px solid blue;"&gt;&lt;tbody&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt; &lt;th style="width: 10%;"&gt;Rank&lt;/th&gt; &lt;th style="width: 30%;"&gt;Name&lt;/th&gt; &lt;th style="width: 30%;"&gt;Country&lt;/th&gt; &lt;th style="width: 20%;"&gt;Total Time&lt;/th&gt; &lt;th style="width: 10%;"&gt;Total Score&lt;/th&gt; &lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;Gary Myers&lt;/td&gt;&lt;td&gt;Australia&lt;/td&gt;&lt;td&gt;11 mins 21 secs&lt;/td&gt;&lt;td&gt;2848&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;Chris Saxon&lt;/td&gt;&lt;td&gt;United Kingdom&lt;/td&gt;&lt;td&gt;19 mins 32 secs&lt;/td&gt;&lt;td&gt;2734&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;João Barreto&lt;/td&gt;&lt;td&gt;Portugal&lt;/td&gt;&lt;td&gt;15 mins 06 secs&lt;/td&gt;&lt;td&gt;2598&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;Viacheslav Stepanov&lt;/td&gt;&lt;td&gt;Russia&lt;/td&gt;&lt;td&gt;19 mins 57 secs&lt;/td&gt;&lt;td&gt;2551&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;Frank Schrader&lt;/td&gt;&lt;td&gt;Germany&lt;/td&gt;&lt;td&gt;19 mins 50 secs&lt;/td&gt;&lt;td&gt;2353&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;Ludovic Szewczyk&lt;/td&gt;&lt;td&gt;Belgium&lt;/td&gt;&lt;td&gt;18 mins 35 secs&lt;/td&gt;&lt;td&gt;2328&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;Siim Kask&lt;/td&gt;&lt;td&gt;Estonia&lt;/td&gt;&lt;td&gt;18 mins 53 secs&lt;/td&gt;&lt;td&gt;2322&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;james su&lt;/td&gt;&lt;td&gt;Canada&lt;/td&gt;&lt;td&gt;16 mins 28 secs&lt;/td&gt;&lt;td&gt;2321&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;kowido&lt;/td&gt;&lt;td&gt;No Country Set&lt;/td&gt;&lt;td&gt;19 mins 49 secs&lt;/td&gt;&lt;td&gt;2254&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;Mike Pargeter&lt;/td&gt;&lt;td&gt;United Kingdom&lt;/td&gt;&lt;td&gt;16 mins 41 secs&lt;/td&gt;&lt;td&gt;2216&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;Sean Stuber&lt;/td&gt;&lt;td&gt;United States&lt;/td&gt;&lt;td&gt;20 mins 00 secs&lt;/td&gt;&lt;td&gt;2150&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;Randy Gettman&lt;/td&gt;&lt;td&gt;United States&lt;/td&gt;&lt;td&gt;18 mins 58 secs&lt;/td&gt;&lt;td&gt;2146&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;13&lt;/td&gt;&lt;td&gt;Filipe Silva&lt;/td&gt;&lt;td&gt;Portugal&lt;/td&gt;&lt;td&gt;18 mins 04 secs&lt;/td&gt;&lt;td&gt;2139&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;14&lt;/td&gt;&lt;td&gt;owbeg&lt;/td&gt;&lt;td&gt;Ukraine&lt;/td&gt;&lt;td&gt;15 mins 48 secs&lt;/td&gt;&lt;td&gt;2109&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;15&lt;/td&gt;&lt;td&gt;Dalibor Kova &lt;/td&gt;&lt;td&gt;Croatia&lt;/td&gt;&lt;td&gt;18 mins 37 secs&lt;/td&gt;&lt;td&gt;2053&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;Jeff Kemp&lt;/td&gt;&lt;td&gt;Australia&lt;/td&gt;&lt;td&gt;11 mins 38 secs&lt;/td&gt;&lt;td&gt;1942&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;17&lt;/td&gt;&lt;td&gt;macabre&lt;/td&gt;&lt;td&gt;Russia&lt;/td&gt;&lt;td&gt;19 mins 41 secs&lt;/td&gt;&lt;td&gt;1931&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;18&lt;/td&gt;&lt;td&gt;Theo Asma&lt;/td&gt;&lt;td&gt;Netherlands&lt;/td&gt;&lt;td&gt;14 mins 48 secs&lt;/td&gt;&lt;td&gt;1829&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;19&lt;/td&gt;&lt;td&gt;Mojibul Hoque&lt;/td&gt;&lt;td&gt;Bangladesh&lt;/td&gt;&lt;td&gt;03 mins 57 secs&lt;/td&gt;&lt;td&gt;1821&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;20&lt;/td&gt;&lt;td&gt;Sayan Malakshinov&lt;/td&gt;&lt;td&gt;Russia&lt;/td&gt;&lt;td&gt;04 mins 32 secs&lt;/td&gt;&lt;td&gt;1809&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;21&lt;/td&gt;&lt;td&gt;Kevan Gelling&lt;/td&gt;&lt;td&gt;Isle of Man&lt;/td&gt;&lt;td&gt;18 mins 28 secs&lt;/td&gt;&lt;td&gt;1781&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;22&lt;/td&gt;&lt;td&gt;Anna Onishchuk&lt;/td&gt;&lt;td&gt;Ireland&lt;/td&gt;&lt;td&gt;17 mins 12 secs&lt;/td&gt;&lt;td&gt;1706&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;23&lt;/td&gt;&lt;td&gt;DikkieDick&lt;/td&gt;&lt;td&gt;Netherlands&lt;/td&gt;&lt;td&gt;13 mins 58 secs&lt;/td&gt;&lt;td&gt;1696&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;24&lt;/td&gt;&lt;td&gt;Alexander Polivany&lt;/td&gt;&lt;td&gt;Ukraine&lt;/td&gt;&lt;td&gt;20 mins 00 secs&lt;/td&gt;&lt;td&gt;1675&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;25&lt;/td&gt;&lt;td&gt;mentzel.iudith&lt;/td&gt;&lt;td&gt;Israel&lt;/td&gt;&lt;td&gt;20 mins 00 secs&lt;/td&gt;&lt;td&gt;1575&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;26&lt;/td&gt;&lt;td&gt;Marc Thompson&lt;/td&gt;&lt;td&gt;Australia&lt;/td&gt;&lt;td&gt;19 mins 39 secs&lt;/td&gt;&lt;td&gt;1557&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;27&lt;/td&gt;&lt;td&gt;Q&lt;/td&gt;&lt;td&gt;Belgium&lt;/td&gt;&lt;td&gt;16 mins 12 secs&lt;/td&gt;&lt;td&gt;1551&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;28&lt;/td&gt;&lt;td&gt;clee&lt;/td&gt;&lt;td&gt;United States&lt;/td&gt;&lt;td&gt;17 mins 56 secs&lt;/td&gt;&lt;td&gt;1441&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;29&lt;/td&gt;&lt;td&gt;NickL&lt;/td&gt;&lt;td&gt;United Kingdom&lt;/td&gt;&lt;td&gt;19 mins 55 secs&lt;/td&gt;&lt;td&gt;1402&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;30&lt;/td&gt;&lt;td&gt;Pavel Zeman&lt;/td&gt;&lt;td&gt;Czech Republic&lt;/td&gt;&lt;td&gt;20 mins 01 secs&lt;/td&gt;&lt;td&gt;1375&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;31&lt;/td&gt;&lt;td&gt;Gerry171&lt;/td&gt;&lt;td&gt;United States&lt;/td&gt;&lt;td&gt;19 mins 00 secs&lt;/td&gt;&lt;td&gt;1345&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;32&lt;/td&gt;&lt;td&gt;Rajesh Venkataramani&lt;/td&gt;&lt;td&gt;India&lt;/td&gt;&lt;td&gt;16 mins 43 secs&lt;/td&gt;&lt;td&gt;1341&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;33&lt;/td&gt;&lt;td&gt;Rosemary&lt;/td&gt;&lt;td&gt;United States&lt;/td&gt;&lt;td&gt;18 mins 38 secs&lt;/td&gt;&lt;td&gt;727&lt;/td&gt;&lt;/tr&gt;
&lt;tr style="border-bottom: 1px solid blue; text-align: center;"&gt;&lt;td&gt;34&lt;/td&gt;&lt;td&gt;Jerry Bull&lt;/td&gt;&lt;td&gt;United States&lt;/td&gt;&lt;td&gt;18 mins 47 secs&lt;/td&gt;&lt;td&gt;40&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-1874914522674485024?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/1874914522674485024/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/07/q2-2011-championship-playoff-results.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/1874914522674485024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/1874914522674485024'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/07/q2-2011-championship-playoff-results.html' title='Q2 2011 Championship Playoff Results'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-2291771779195863026</id><published>2011-07-24T15:00:00.000+01:00</published><updated>2011-07-24T15:00:49.085+01:00</updated><title type='text'>Objections to PL/SQL warnings quiz in Q2 2011 playoff (4483)</title><content type='html'>The Q2 2011 playoff tested players' knowledge of Oracle's compile-time warnings, in particular some key warnings added in Oracle Database 11g Release 2. In this quiz, we showed a program unit and asked &lt;i&gt;how many&lt;/i&gt; warnings would be displayed by Oracle.&lt;br /&gt;
&lt;br /&gt;
Players had the following objections:&lt;br /&gt;
&lt;br /&gt;
"I hope I never see another question like this again! I can't imagine how anyone  could have gotten this one correct without actually typing in and running it. I  would have preferred if the question was in the form "which of the following  warnings would be shown", and the answers would include these and perhaps other  unrelated warning messages."&lt;br /&gt;
&lt;br /&gt;
"I think that this quiz was somehat unfair towards players that are using 11gR1.  As by my test performed with 11gR1 (11.1.0.7.0.), there are only 4 warnings  generated, namely: PLW-7203, PLW-5004, PLW-6009 and PLW-5005. The additional two  ones, specific for 11gR2 are even not mentioned in the PL/SQL Documentation of  11gR2, nor in other sources, like your book PL/SQL Programming 5-th Ed, so those  who are NOT using this version were unable to know about it. By the way, there  is no consistent source that offers a complete list of all these warnings, for  any version. So, I think that for the sake of fairness, this quiz should be  rescored and considered as correct any answer that fits the previous releases,  11gR1 and 10gR2. I did not check 10gR2, it may be the same as 11gR1."&lt;br /&gt;
&lt;br /&gt;
I can see why this quiz would have been a source of frustration and perhaps irritation, but I don't see why I should rescore.&lt;br /&gt;
&lt;br /&gt;
The Oracle documentation of every version offers an Error Messages &lt;a href="http://download.oracle.com/docs/cd/E11882_01/server.112/e17766/toc.htm"&gt;book&lt;/a&gt;, which contains (so far as I know) a comprehensive list of warnings. This quiz specified 11.2 as the minimum version.&lt;br /&gt;
&lt;br /&gt;
So to answer the question correctly, you needed to (a) read the code and identify fairly obvious problems with it; (b) be generally conversant with the way compile-time warnings work; and (c) either be aware of the new warnings added in 11.1 and 11.2 or scan the documentation for verification of your analysis.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-2291771779195863026?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/2291771779195863026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/07/objections-to-plsql-warnings-quiz-in-q2.html#comment-form' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/2291771779195863026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/2291771779195863026'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/07/objections-to-plsql-warnings-quiz-in-q2.html' title='Objections to PL/SQL warnings quiz in Q2 2011 playoff (4483)'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-8639749064266999334</id><published>2011-07-22T21:36:00.000+01:00</published><updated>2011-07-22T21:36:51.577+01:00</updated><title type='text'>Valid partial step in optimizing code? (4482)</title><content type='html'>In the Q2 2011 playoff, one of the questions examined the nuances of using BULK COLLECT and FORALL to optimize one's code. We asked players "Which of the statements below describe a complete or partial step  towards improving the performance of this program, while keeping intact  all current functionality?"&lt;br /&gt;
&lt;br /&gt;
And we scored as &lt;i&gt;incorrect &lt;/i&gt;this choice:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;"Keep the cursor FOR loop in place (they are automatically optimized by  Oracle into BULK COLLECT levels of performance). Simply replace the two  DML statements with FORALL statements within that cursor FOR loop."&lt;/div&gt;&lt;br /&gt;
A player objected, feeling that this should be scored as correct, arguing:&lt;br /&gt;
&lt;br /&gt;
"I checked this answer as correct because, as another player mentioned, the question did ask “complete or partial step towards improving the performance of this program”.  It is not a solution, of course, because there needs to be a bulk collect off the cursor to create the collection(s) necessary for a forall statement to work.  Of course, that would also be a “step”.  But this answer also is a “partial step towards improving the performance”.  I think that this answer should be scored as correct.  I interpreted the word “step” to mean “one of things that I would need to do to improve the performance”.  To make this answer incorrect, I would have added the following clarifying language to the question: “and resulting in a working program that compiles without error”.  But the English language is much more ambiguous than the PL/SQL language."&lt;br /&gt;
&lt;br /&gt;
Another player wrote to say about two &lt;i&gt;other&lt;/i&gt; of the choices:&lt;br /&gt;
&lt;br /&gt;
"I have to disagree with the answers to this question. The question clearly states  "Which of the statements below describe a complete OR PARTIAL step towards  improving the performance of this program, while keeping intact all current  functionality?" (emphasis mine). Answers that describe a reasonable step that  the programmer may take, even if they are not complete, should still be marked  correct in my opinion. For example: "Replace the two DML statements (insert and  update) with one FORALL statement that executes those same two statements, using  data in collections populated by a BULK COLLECT." - you object to this answer  because it doesn't completely fulfill the requirements. But a FORALL statement  could most definitely be used to improve the performance - sure, it doesn't  completely fulfill the requirements, the programmer has to do more than that,  but it is still a partial step towards improving the program. Similarlarly, "Add  a LOG ERRORS to both DML statements and put them inside FORALL statements." -  this is a good partial step. All I have to do is add some code to raise an  exception if I find an error in SQL%BULK_EXCEPTIONS. The other answers were  steps in the *wrong* direction, and were correctly marked as wrong for that  reason."&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;My responses:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
First, I recognize the problematic aspect of including "or partial" in our question text. We actually included it so that a player couldn't argue that a single choice was or wasn't a &lt;i&gt;complete&lt;/i&gt; solution. Ah, well...&lt;br /&gt;
&lt;br /&gt;
Still, I am ready to defend with full vigor my scoring. Here goes:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;"Keep the cursor FOR loop in place (they are automatically optimized by   Oracle into BULK COLLECT levels of performance). Simply replace the two   DML statements with FORALL statements within that cursor FOR loop." [7281]&lt;/div&gt;&lt;br /&gt;
It sounds like this rationale for marking this as correct is:&lt;br /&gt;
&lt;br /&gt;
Sure, Steven, you say you will keep the cursor for loop "in place" but that's just &lt;i&gt;for now&lt;/i&gt;. Later you will come back and change it to a bulk collect. So it is a &lt;i&gt;partial&lt;/i&gt; step.&lt;br /&gt;
&lt;br /&gt;
I certainly do understand that rationale. But I also find myself objecting to it. Why? Because the language of the choice implies (strongly, to my mind) that this is not simply a transitional step. It is a &lt;i&gt;misunderstanding &lt;/i&gt;of the technology. Compare the text of answer 7281 to this:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Change the two DML statements into FORALL statements within the cursor FOR loop.&lt;br /&gt;
&lt;br /&gt;
&lt;/b&gt;This actually still makes little sense (what collection would "feed" the FORALL statement?), but one could argue that the bulk collect step is "next." OK.&lt;br /&gt;
&lt;br /&gt;
But in 7281, I explicitly say I will keep the cursor for loop "in place" and even include a parenthetical clause explaining &lt;i&gt;why &lt;/i&gt;- this sentence is saying "This developer thinks that because the cursor FOR loop is auto-optimized, there is no need to change it. Then I include "Simply" in the second sentence to imply that I will do nothing more.&lt;br /&gt;
&lt;br /&gt;
I realize that I am now having a discussion about English syntax and semantics, not PL/SQL code per se. But that is certainly the rationale for why I wrote it that way. I find it hard to read that choice and think to myself, "Oh, that is just the first step in a series planned by this person."&lt;br /&gt;
&lt;br /&gt;
On to the others:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;Replace the two DML statements (insert and update) with one FORALL  statement that executes those same two statements, using data in  collections populated by a BULK COLLECT. [7282]&lt;/div&gt;&lt;br /&gt;
I don't see how this could be interpreted as a partial/transitional step towards an improved program. You absolutely &lt;i&gt;cannot&lt;/i&gt; replace these two DML statements with a single FORALL statement. Again, that reveals a misunderstanding of FORALL. You can only have one DML statement in each FORALL. So how can this be a partial step? You'd have to &lt;i&gt;undo&lt;/i&gt; everything you do in this step to get it to work!&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;Add  a LOG ERRORS to both DML statements and put them inside FORALL statements. [7286]&lt;/div&gt;&lt;br /&gt;
Again, I don't see how to recognize this as a valid step towards a properly refactored program. You &lt;i&gt;cannot&lt;/i&gt; use LOG ERRORS without changing the behavior of the program. LOG ERRORS suppresses errors at the row level, and we need to do statement-level suppression of exceptions. You certainly can't add code using SQL%BULK_EXCEPTIONS, because when you use LOG ERRORS, &lt;i&gt;no exceptions are raised at all&lt;/i&gt;. So that pseudo collection will remain empty.&lt;br /&gt;
&lt;br /&gt;
Your thoughts?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-8639749064266999334?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/8639749064266999334/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/07/valid-partial-step-in-optimizing-code.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/8639749064266999334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/8639749064266999334'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/07/valid-partial-step-in-optimizing-code.html' title='Valid partial step in optimizing code? (4482)'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-4379962573842396752</id><published>2011-07-21T17:32:00.002+01:00</published><updated>2011-07-21T17:32:35.320+01:00</updated><title type='text'>Special $49.95 One-month Subscripton PL/SQL Channel</title><content type='html'>&lt;h3 class="post-title entry-title"&gt; &lt;/h3&gt;&lt;div class="post-header"&gt;  &lt;/div&gt;&lt;div&gt; &lt;div&gt; I announced availability of the PL/SQL Channel several  months ago: 27+  hours of recorded trainings on the Oracle PL/SQL  language, available at the &lt;a href="http://plsqlchannel.com/" target="_blank"&gt;PL/SQL Channel&lt;/a&gt; and covering many (but  admittedly not yet &lt;em&gt;all&lt;/em&gt;) features of the PL/SQL language. At $395 per  year per developer for unlimited access to all this content, the &lt;a href="http://plsqlchannel.com/" target="_blank"&gt;PL/SQL Channel&lt;/a&gt;  is the most cost-effective use  of your training dollars for PL/SQL  developers, with much greater short- and  long-term impact than  one-time, instructor-led trainings.&lt;br /&gt;
&lt;br /&gt;
I have also found, however, that many developers (or their managers) are   reluctant to pay a subscription fee for a whole year, when their  training  budgets are very tight and they are not sure they will be  using the PL/SQL  Channel videos for such an extended length of time.&lt;br /&gt;
&lt;br /&gt;
&lt;b style="color: blue;"&gt;We have decided, therefore, to offer access to the PL/SQL Channel for 30 days  for just $49.95. &lt;/b&gt;Yes,  that's right - for less than $2 per day you can access  dozens of  PL/SQL videos with detailed trainings, plus their supporting   presentation documents and code. &lt;strong&gt;This special price will be available  through the end of September 2011.&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;&amp;nbsp;&lt;/strong&gt; &lt;br /&gt;
We are also continuing our free, 30 day trial of the PL/SQL Channel (limited,  however, to viewing of just five videos).&lt;br /&gt;
&lt;br /&gt;
To start your free trial of the PL/SQL Channel, click &lt;a href="http://tutorials.plsqlchannel.com/public/apply_for_trial.php" target="_blank"&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
To order your $49.95 subscription to the PL/SQL Channel, click &lt;a href="http://tutorials.plsqlchannel.com/public/purchase_subscription.php" target="_blank"&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Note: the thirty-day period starts on the day you purchase your  subscription.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-4379962573842396752?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/4379962573842396752/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/07/special-4995-one-month-subscripton.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/4379962573842396752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/4379962573842396752'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/07/special-4995-one-month-subscripton.html' title='Special $49.95 One-month Subscripton PL/SQL Channel'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-3440439817515200955</id><published>2011-07-18T13:59:00.000+01:00</published><updated>2011-07-18T13:59:47.827+01:00</updated><title type='text'>Tricky choice tricks the quiz author! (4720)</title><content type='html'>In the logic puzzle for the week of 9 July, we scored the following choice as correct:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;If 1 is in the solution then the other numbers must be (2, 4, 7).&lt;/div&gt;&lt;br /&gt;
The explanation given was this: "If 1 is in the solution, then the third turn tells us that (3, 6, 5)  cannot be in the solution. The only 3 numbers left are (2, 4, 7) and  looking over the first two turns, they would be compatible. So the four  numbers (1, 2, 4, 7) could be in the solution together."&lt;br /&gt;
&lt;br /&gt;
The third turn showed that (3 1 6 5) had just one correct digit, not in the right location.&lt;br /&gt;
&lt;br /&gt;
As two players pointed out to me, the third turn shows that (2 4 7) &lt;i&gt;have&lt;/i&gt; to be in the solution, &lt;i&gt;regardless&lt;/i&gt; of the status of 1. We need four digits, the third turn tells us that at most one of (1 3 6 5) are in the solution, so we need all of the other three digits (2 4 7).&lt;br /&gt;
&lt;br /&gt;
Thus, 2, 4 and 7 &lt;i&gt;must&lt;/i&gt; be in the solution - but that fact has &lt;i&gt;nothing &lt;/i&gt;to do with whether or not 1 is in the solution.&lt;br /&gt;
&lt;br /&gt;
In other words, even if 1 is not in the solution, 2, 4 and 7 must still be in the solution.&lt;br /&gt;
&lt;br /&gt;
So what's a poor quiz administrator to do about this? I was at first tempted to do what I usually do: give everyone credit for a correct answer to this choice, and change the text to get rid of this "problem."&lt;br /&gt;
&lt;br /&gt;
But then I thought: wait a minute, the &lt;i&gt;whole point&lt;/i&gt; of this puzzler is to test our facility with logical thinking. Clearly, I have demonstrated that I am not as good at this sort of thing as I thought (and by the way, 62% of all players selected this choice as correct).&lt;br /&gt;
&lt;br /&gt;
So it seems to me that what I should do is (a) change this choice to be incorrect; (b) recalculate the scores of all players; (c) change the difficulty level of this quiz to Advanced.&lt;br /&gt;
&lt;br /&gt;
What do you think, dear players?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-3440439817515200955?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/3440439817515200955/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/07/tricky-choice-tricks-quiz-author-4720.html#comment-form' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/3440439817515200955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/3440439817515200955'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/07/tricky-choice-tricks-quiz-author-4720.html' title='Tricky choice tricks the quiz author! (4720)'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-4998632447163982200</id><published>2011-07-17T13:51:00.015+01:00</published><updated>2011-07-17T13:56:02.736+01:00</updated><title type='text'>Column headers "fair game" for choices? (4180)</title><content type='html'>The SQL quiz on PIVOT for the week of 9 July asked which of the choices produce this desired output:&lt;br /&gt;
&lt;pre&gt;DEPARTMENT_ID       LESS       MORE
------------- ---------- ----------
          100          2          0
          200          2          1
&lt;/pre&gt;And we scored a choice as incorrect simply because the column headers would not match what is shown above. Specifically, the headers would be:&lt;br /&gt;
&lt;pre&gt;DEPARTMENT_ID&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'LESS'&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'MORE'
&lt;/pre&gt;A player raised a concern about this as follows:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;I just answered today's SQL quiz a few seconds ago, and it looks to me, as far  as I can remember, that something is missing from the general assumptions for  the SQL quizzes, namely, a clear statement regarding the column headers. It  would be very sad if those that perfectly master the PIVOT clause (including the  alias usage for the column headers in this context), and have answered correctly  today's quiz would be finally penalized because of eventually not accepting the  quoted string as a correct column header, while the query result is the correct  one, including the ordering. While from the previous quizzes we already learnt  "silently" that the ORDER BY does matter, that is, a correct solution is  supposed to produce the same ordering as presented in the sample shown in the  quiz (ordering being always an intrinsic part of the SQL), the column headers  issue is a little bit more "volatile", as, what we see it is not always strictly  a part of the SQL statement itself ( for example, columns headings can be set by  the client tool used, like the COLUMN statement in SQL*PLUS, a.s.o. ). In my  opinion, the correctness of a query result set should not be made dependent on  the column headers, though others might think otherwise. Regardless of the very  specific case of the PIVOT clause, and maybe exactly because of it, and since  our competition is still at the beginning, maybe a clarification on this issue  in the assumptions would be most welcome and would remove ambiguities.&lt;/div&gt;&lt;br /&gt;
The author of the quiz offers this response:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;We could perhaps make the assumptions a little bit clearer – but the assumptions should never become a multipage description that no one will read J.&lt;/div&gt;&lt;br /&gt;
&lt;div style="color: blue;"&gt;I can understand a wish for the assumptions to make everything 110% unambiguous – but the danger is if we keep making the assumptions more and more detailed and larger and larger, then practically every tiny objection could argue that it should be part of the assumptions, and then the assumptions would become a document as large as the SQL documentation J. The more we add to assumptions, the less a player will feel that he/she has to use “common sense”…&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="color: blue;"&gt;The reason I included the “un-aliased” answer in this PIVOT quiz (and scored it false) was to enhance awareness of proper column naming. If for example this SQL statement were to be used in some client environment where the client code references columns of the resultset by name, then you would get errors if you didn’t alias. Example: IF (Resultset("LESS") &amp;gt; 1) {do something&lt;do something=""&gt;} would &lt;i&gt;fail &lt;/i&gt;if the column was not aliased. So actually the correctness IMHO does depend on the headers as well as the correct data – if you are a “back-end” developer, how you name columns in your output will matter to the front-end developer who has to use your result sets in his or her code.&lt;br /&gt;
&lt;br /&gt;
I would argue against rescoring this particular quiz – it was very much on purpose I provided a choice that failed only in the headers.&lt;/do&gt;&lt;/div&gt;&lt;br /&gt;
&lt;do something=""&gt;My (Steven) feeling about this: generally, we should &lt;i&gt;not&lt;/i&gt; make choice correctness dependent on issues that are irrelevant to an understanding of the technology or how it plays out in our day to day experience. In this case, however, Kim argues persuasively that it was quite relevant and something for developers to be aware of.&lt;/do&gt;&lt;br /&gt;
&lt;do something=""&gt; &lt;/do&gt;&lt;br /&gt;
&lt;do something=""&gt;What do you think?&lt;/do&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-4998632447163982200?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/4998632447163982200/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/07/column-headers-fair-game-for-choices.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/4998632447163982200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/4998632447163982200'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/07/column-headers-fair-game-for-choices.html' title='Column headers &quot;fair game&quot; for choices? (4180)'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-4244223010330208214</id><published>2011-07-15T12:24:00.000+01:00</published><updated>2011-07-15T12:24:54.688+01:00</updated><title type='text'>Use LIMIT to "control PGA" in session? (4498)</title><content type='html'>The 14 July quiz tested your knowledge of the LIMIT clause of BULK COLLECT. We scored as correct the following choice:&lt;br /&gt;
&lt;div style="color: blue;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="color: blue;"&gt;Use the LIMIT clause to control the amount of Process Global Area (PGA) memory used by the session running your program.&lt;/div&gt;&lt;br /&gt;
A player raised the following objection to this:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;While limiting the number of rows returned is likely to reduce the amount of  memory required, it does not constrain the amount of PGA allocated. Even if I  were to agree that it controlled the amount of PGA used by the BULK COLLECT,  that is not the same as controlling it for the session.&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Before I respond, I would like to offer it up to other players for their comments. What do you think? Should we mark this as incorrect and why? Or do you feel this language is sufficiently clear to warrant a correct scoring?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-4244223010330208214?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/4244223010330208214/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/07/use-limit-to-control-pga-in-session.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/4244223010330208214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/4244223010330208214'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/07/use-limit-to-control-pga-in-session.html' title='Use LIMIT to &quot;control PGA&quot; in session? (4498)'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-9077549061029411110</id><published>2011-07-08T16:48:00.000+01:00</published><updated>2011-07-08T16:48:12.761+01:00</updated><title type='text'>The nuances of ending CASE (3577)</title><content type='html'>The 7 July quiz tested your knowledge of using CASE &lt;i&gt;expressions &lt;/i&gt;to implement conditional logic.&lt;br /&gt;
&lt;br /&gt;
One player wrote: &lt;span style="color: blue;"&gt;"I just marked all of the answers wrong because the CASE statements didn't end  with END CASE (the SQL one I reckoned was wrong anyway). Is this an error in  quiz, or is it deliberate, or am I wrong about CASE statements needing to end  with 'END CASE'? I would have marked at least one answer as correct if it wasn't  for that."&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Unfortunately, this player was wrong, but the confusion is very understandable.&lt;br /&gt;
&lt;br /&gt;
When you use CASE in PL/SQL, you can write either a CASE statement or a CASE expression.&lt;br /&gt;
&lt;br /&gt;
A CASE statement requires an "END CASE" for termination.&lt;br /&gt;
&lt;br /&gt;
A CASE expression is terminated only with an "END". &lt;br /&gt;
&lt;br /&gt;
I don't really know why Oracle took these different approaches. Any thoughts out there?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-9077549061029411110?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/9077549061029411110/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/07/nuances-of-ending-case-3577.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/9077549061029411110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/9077549061029411110'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/07/nuances-of-ending-case-3577.html' title='The nuances of ending CASE (3577)'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-4129128107211800741</id><published>2011-07-05T16:17:00.000+01:00</published><updated>2011-07-05T16:17:19.874+01:00</updated><title type='text'>TOO_MANY_ROWS and indeterminate behavior (3574)</title><content type='html'>The 4 July quiz tested your knowledge of the impact of querying more than one row with a SELECT INTO. The TOO_MANY_ROWS exception is raised, but the question then is: what if anything will the variable(s) in the INTO clause of the SELECT statement be set to?&lt;br /&gt;
&lt;br /&gt;
As we state in the answer:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;According to Oracle documentation&lt;a href="http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/selectinto_statement.htm#sthref3054"&gt;&lt;/a&gt;, the state of a variable that you SELECT INTO will be undefined if the statement  raises TOO_MANY_ROWS....&lt;em&gt;In practice&lt;/em&gt;, however, it seems that the data from the first row  returned by the query is assigned to the variable(s) in the INTO clause; only  when the second row is fetched is the TOO_MANY_ROWS exception raised.&lt;/div&gt;&lt;br /&gt;
We have had several quizzes that delve into such "indeterminate" behavior and generally have taken the position that if the actual, day-to-day experience does not seem to be indeterminate (in this case, the variable(s) are populated with the data from the first row fetched), then it is a legitimate topic and answer for a quiz.&lt;br /&gt;
&lt;br /&gt;
Several players raised objections (of course!). One person objected to making a quiz involving undocumented behavior like this an "only one choice correct" quiz. That is too harsh a penalty for getting it "wrong" (which in this case would mean following what the documentation says). I agree with this. We are definitely going to change the question type to "more than one choice might be correct" and rescore. But we will likely also correct the scoring on some of the other choices.&lt;br /&gt;
&lt;br /&gt;
Before I do that, though, I invite players who submitted concerns and code examples to post them on this blog. They've made some very interesting discoveries!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-4129128107211800741?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/4129128107211800741/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/07/toomanyrows-and-indeterminate-behavior.html#comment-form' title='23 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/4129128107211800741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/4129128107211800741'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/07/toomanyrows-and-indeterminate-behavior.html' title='TOO_MANY_ROWS and indeterminate behavior (3574)'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>23</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-4033745700616819261</id><published>2011-07-05T13:48:00.000+01:00</published><updated>2011-07-05T13:48:18.594+01:00</updated><title type='text'>UNION ALL and sorting - first objection for a SQL quiz! (3466)</title><content type='html'>The SQL quiz on GROUPING SETS (week of 25 June) raised the following objection from a player:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: blue;"&gt;"I don't think the second choice (the "do-it-yourself implementation") is  correct, because it relies on the fact, that the UNION ALL operator preserves  the order of the rows returned by subqueries. This seems to be true in recent  versions of Oracle database, but I cannot find it documented anywhere, so it  should not be relied on. Or am I missing something here?"&lt;/div&gt;&lt;br /&gt;
Since I am fortunate enough to have authors and reviewers with much more depth in SQL than I working on the SQL quiz, I will post this objection and leave it to them (and the rest of you) to respond. Then we will conclude a next step for this quiz.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-4033745700616819261?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/4033745700616819261/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/07/union-all-and-sorting-first-objection.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/4033745700616819261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/4033745700616819261'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/07/union-all-and-sorting-first-objection.html' title='UNION ALL and sorting - first objection for a SQL quiz! (3466)'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-7576498742610844351</id><published>2011-07-04T16:18:00.001+01:00</published><updated>2011-07-04T16:19:07.592+01:00</updated><title type='text'>Q2 2011 PL/SQL Championship Playoff Participants</title><content type='html'>We are pleased, indeed, to present to you the 44 players who have qualified to participate in the Q2 2011 PL/SQL Championship Playoff. For more details on how these players are selected, check out the &lt;a href="http://www.plsqlchallenge.com/pls/apex/f?p=10000:FAQ:1090482354317913:FAQ:NO:::"&gt;FAQ&lt;/a&gt;. It takes lots of discipline and knowledge to make it to the playoffs, and we congratulate every single one of you.&lt;br /&gt;
&lt;br /&gt;
We currently plan to hold the playoff on Thursday, 21 July, though that could change if enough players cannot participate on that day.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;b&gt;_Nikotin (Russia) Ranked 1 (Ranking)
Frank Schrader (Germany) Ranked 2 (Ranking)
kowido (No Country Set) Ranked 3 (Ranking)
Christopher Beck (United States) Ranked 4 (Ranking)
Joaquin Gonzalez (Spain) Ranked 5 (Ranking)
DikkieDick (Netherlands) Ranked 6 (Ranking)
Jeff Kemp (Australia) Ranked 7 (Ranking)
Pavel Zeman (Czech Republic) Ranked 8 (Ranking)
Siim Kask (Estonia) Ranked 9 (Ranking)
Dennis Klemme (Germany) Ranked 10 (Ranking)
Mojibul Hoque (Bangladesh) Ranked 11 (Ranking)
Jerry Bull (United States) Ranked 12 (Ranking)
mentzel.iudith (Israel) Ranked 13 (Ranking)
Filipe Silva (Portugal) Ranked 14 (Ranking)
Mike Pargeter (United Kingdom) Ranked 15 (Ranking)
Ludovic Szewczyk (Belgium) Ranked 16 (Ranking)
Sean Stuber (United States) Ranked 17 (Ranking)
Alexander Polivany (Ukraine) Ranked 18 (Ranking)
Viacheslav Stepanov (Russia) Ranked 19 (Ranking)
Hans Van Der Wildt (Belgium) Ranked 20 (Ranking)
Rajesh Venkataramani (India) Ranked 21 (Ranking)
Dalibor Kovač (Croatia) Ranked 22 (Ranking)
clee (United States) Ranked 23 (Ranking)
Randy Gettman (United States) Ranked 24 (Ranking)
Kevan Gelling (Isle of Man) Ranked 25 (Ranking)
Gary Myers (Australia) Ranked 30 (Wildcard)
sbramhe (No Country Set) Ranked 31 (Wildcard)
João Barreto (Portugal) Ranked 32 (Wildcard)
Chris Saxon (United Kingdom) Ranked 33 (Wildcard)
Anna Onishchuk (Ireland) Ranked 35 (Wildcard)
Theo Asma (Netherlands) Ranked 38 (Wildcard)
Q (Belgium) Ranked 42 (Wildcard)
xtender (Russia) Ranked 55 (Wildcard)
Marc Thompson (Australia) Ranked 58 (Correctness)
james su (Canada) Ranked 65 (Correctness)
owbeg (Ukraine) Ranked 69 (Correctness)
RajenB (Mauritius) Ranked 102 (Correctness)
Suresh Nair (United States) Ranked 122 (Wildcard)
macabre (Russia) Ranked 126 (Correctness)
Rosemary (United States) Ranked 173 (Correctness)
Arockia Arul Sekar (India) Ranked 246 (Correctness)
Tas Kartas (Australia) Ranked 261 (Correctness)
Gerry171 (United States) Ranked 397 (Correctness)
NickL (United Kingdom) Ranked 490 (Correctness)
&lt;/b&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8677649049588007585-7576498742610844351?l=plsql-challenge.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://plsql-challenge.blogspot.com/feeds/7576498742610844351/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://plsql-challenge.blogspot.com/2011/07/q2-2011-plsql-championship-playoff.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/7576498742610844351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8677649049588007585/posts/default/7576498742610844351'/><link rel='alternate' type='text/html' href='http://plsql-challenge.blogspot.com/2011/07/q2-2011-plsql-championship-playoff.html' title='Q2 2011 PL/SQL Championship Playoff Participants'/><author><name>Steven Feuerstein</name><uri>http://www.blogger.com/profile/16619706770920320550</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_T36BCpq6JMA/SS1eLk_gCXI/AAAAAAAAABw/NGDUGIvHoNU/S220/steven-angled.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8677649049588007585.post-649699262375935728</id><published>2011-07-04T14:18:00.000+01:00</published><updated>2011-07-04T14:18:14.521+01:00</updated><title type='text'>How to View SQL and APEX Rankings</title><content type='html'>With the advent of a wide array of new quizzes (SQL, APEX, Logic - and more to come!), you will also naturally want to see rankings for those quizzes.&lt;br /&gt;
&lt;br /&gt;
Today, you can view rankings for these other technologies as follows:&lt;br /&gt;
&lt;br /&gt;
First, on the home page in myPerformance, simply choose a different technology from the dropdown list and you will see the playing stats for that technology.&lt;br /&gt;
&lt;img alt="" src="data:image/png;base64,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" /&gt;&lt;br /&gt;
Second, on the Classic Rankings page, you can also select the technology:&lt;br /&gt;
&lt;img alt="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAigAAAGMCAIAAAB/Cs63AAAgAElEQVR4nO29eZAcx33v2RAGwFihlRy27IXjhcMbb9+LVYheC/S+p/UliCIJsCPek8jdeGvqLWMlUJIlUZZMSugNyytItETTtClRlECCuJqiSQEUZwAQFwlgQBANDjA999lzXz0H5sIcmMFMT89MH7V/VHd1ZtYvs6rvA99PVJCD6qrMX/7y+NavKivLoQEAAAA5xJFvAwAAANxdQHgAAADkFAgPAACAnALhAQAAkFMgPAAAAHIKhAcAAEBOgfAAAADIKRAeAAAAOQXCAwAAIKdAeAAAAOSUzAvPx8+89vEzr5VVustOHC6rPLzlrUNllUfLThwsqzyc1La14nDZicNbKw5n3EIAAAB5JFvCE9tO/1r/Y/vbr3H7bWy/d/rV33n71bK3jmbcQgAAAHkky8JjqS5WB/zO6V9l3EIAAAB5JLvCE4lEwuFwOBwOhULhcDgUCYci4XA4HAmFtY1oJBQNhaP6MaFIOBIKhzdC4XA0HI6GwtFwOKzLUsYtBAAAkEeyLjyJHyJRLWo+XD8gEtGi+o/R2M5IKBT6OIQHAABKjtwJT1TTopoW4cQnEtUimq5HUU3TItFoWIvrD4QHAABKklwKT8TQHVPkE4lqWlSLRLVIPOKB8AAAQGmSw1ttWsR8cDQaNZQmGo2FRVEtpEF4AACgRMmh8DCxTjQaTgRAUS0ajWpaJBqNxu+7aRqEBwAASpTcPuOJxp/maBFN0yIRbX0juh5cC4ejaxvBgZmZodnZUGRDlx4IDwAAlCTZFZ7YjbQYiQc80XAkEAg2T47/urftZ77Gd4b63h3u/88XK750vWp1dRXPeAAAoITJrvCEo7GbaTpRLaJp2upa8P2xgSe8733y3PHNJw+XVR793VOvfvT00T86d+xId8vGxkZU06KY1QYAACVKdoVHi0RjEwfiQUwwGDzc2fY/nnljc+WhssrDZZVHN1ceKqs49Lunf1UzOrYeXNO0iD6zDcIDAAAlSXaFZyMaib0NqmmrwfXamyNf83rKTrjLKg5tqzxSVnlYXzx0a+XBz15+e/L2QiSiaVpI01J9j8fvdjp0XB7zrx6XQ/FrLknYSZFJ69icyHQTTsmdV9TFdzgcTrc/B2YYRbeVncno3BgJQCmS/ckFUS0SiawHVt2d7X947vXNlYfKK4/o4c6WE0fKKo+W
