home bbs files messages ]

Forums before death by AOL, social media and spammers... "We can't have nice things"

   comp.databases.oracle      Overblown overpriced overengineered SHIT      2,288 messages   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]

   Message 938 of 2,288   
   Chris Leonard to All   
   Re: basic PL/SQL questions   
   08 Jan 04 15:32:10   
   
   From: s_p_a_m_chris@hotmail.com   
      
   Responses inline...   
      
   > The way a cursor works is that once a record is fetched it is taken out of   
   > the cursor.   
   IIRC, what you mean to say is that once a record is fetched it is popped out   
   of the "active set" (that is, the group of records meeting the query   
   requirements that are waiting to be fetched from the server) and fetched   
   into your execution context's (PGA) local memory.   
      
   > This works well until the last record is reached at which time   
   > fetch will continue to return the last record in the cursor unless you use   
   > the %FOUND and %NOTFOUND constructs to test for the last record?   
   Well, with a cursor for loop like your code is using, the test for   
   CURSOR%NOTFOUND is implicit, so you'll never run into this problem.   
   However, if you have code that attempts to use fetch to pop a value off of   
   the active set into your execution context's memory, then the   
   CURSOR%NOTFOUND is set, but your local variables don't change - not even the   
   one you've fetched into.  That's why you'll see the same item over and   
   over - fetch doesn't return the last item repeatedly (at least not as far as   
   I'm aware), you just keep reusing the same value which has not been replaced   
   by any newly fetched value.  Try this code in SCOTT's schema, and you'll see   
   the last record repeated over several times because the loop (here, just a   
   normal while loop and not a cursor for loop) does not check for   
   CURSOR%NOTFOUND or CURSOR%FOUND:   
      
   declare   
     cursor c1 is select ename from emp;   
     myrec c1%rowtype;   
     x number(2) := 0;   
   begin   
     open c1;   
     fetch c1 into myrec;   
     while x < 40 loop   
       dbms_output.put_line (myrec.ename);   
       fetch c1 into myrec;   
       x := x + 1;   
     end loop;   
   end;   
   /   
      
      
   >   
   > The cursor loop used in the above example eliminates the need to open,   
   close   
   > and fetch. It also eliminates the need to check for the last record.   
   /   
   Yes, the open, fetch, and close statements are implicit with the cursor for   
   loop syntax.   
      
   > There is no formal declaration of the cursor name "product_rec" first used   
   > on line 6. Is this an example of an implicit cursor of table-based record   
   > type?   
   No, but you're close.  It's not a table-based record type, but rather a   
   cursor-based record type.  It's as though the DECLARE section had a line at   
   the end that read as follows:   
      
       PRODUCT_REC PRODUCT_CUR%ROWTYPE   
      
   >   
   > On line 9 how does PL/SQL know that there is a product_price field in the   
   > cursor record? Is this also part of the implicit cursor definition?   
   It knows this because of the implicit declaration of the product_rec   
   variable (see above).   
      
   Hope this helps!   
   Chris   
      
   ___________________________________   
      
   Chris Leonard, The Database Guy   
   http://www.databaseguy.com   
      
   Brainbench MVP for Oracle Admin   
   http://www.brainbench.com   
      
   MCSE, MCDBA, OCP, CIW   
   ___________________________________   
      
   --- SoupGate-Win32 v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]


(c) 1994,  bbs@darkrealms.ca