473,396 Members | 2,089 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,396 software developers and data experts.

basic PL/SQL questions

Please excuse the basic nature of these questions - I'm just starting off.

This example is taken from Oracle PL/SQL 101 - Osborne/McGraw-Hill - ISBN
0-07-212606-X - page 314

Numbers to the left are line numbers for reference only. Hopefully I haven't
made any typing mistakes.

1. DECLARE

2. CURSOR product_cur IS

3. SELECT * FROM plsql101_product

4. FOR UPDATE OF product_price;

5. BEGIN

6. FOR product_rec IN product_cur

7. LOOP

8. UPDATE plsql101_product

9. SET product_price = (product_rec.product_price =
0.97)

10. WHERE CURRENT OF product_cur

11. END LOOP;

12. END;

Am I correct to say the following?

The way a cursor works is that once a record is fetched it is taken out of
the cursor. 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?

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.

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?

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?

Thanks

J.
Jul 19 '05 #1
2 13423
UNIXNewBie wrote:
Please excuse the basic nature of these questions - I'm just starting off.

This example is taken from Oracle PL/SQL 101 - Osborne/McGraw-Hill - ISBN
0-07-212606-X - page 314

Numbers to the left are line numbers for reference only. Hopefully I haven't
made any typing mistakes.

1. DECLARE

2. CURSOR product_cur IS

3. SELECT * FROM plsql101_product

4. FOR UPDATE OF product_price;

5. BEGIN

6. FOR product_rec IN product_cur

7. LOOP

8. UPDATE plsql101_product

9. SET product_price = (product_rec.product_price =
0.97)

10. WHERE CURRENT OF product_cur

11. END LOOP;

12. END;

Am I correct to say the following?

The way a cursor works is that once a record is fetched it is taken out of
the cursor. No, fetched is fetched - it "stays" until your fetch the next one.

This works well until the last record is reached at which time fetch will continue to return the last record in the cursor
No - just give it a try - oracle will generate an error
unless you use the %FOUND and %NOTFOUND constructs to test for the last record?

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.
It's there: for x IN y : as long as there's an x fetched, do...
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? Ehhh - not sure about the semantics, but it sounds familiar. Undoubtedly
you'll get a concise, yes/no answer.

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?

You know, or need to know. As a programmer.
It is checked during compile, if the above is part of a procedure.

Inline...

--

Regards,
Frank van Bortel

Jul 19 '05 #2
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
___________________________________
Jul 19 '05 #3

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

2
by: AK | last post by:
I don't want any part of the previous discussion on Visual Basic versus Visual Basic.Net. My query is about using Visual Basic for Applications; and whether it is better to use Visual Basic 6 or...
8
by: Orange Free | last post by:
I want to create a program that will ask a user a series of questions and then generate a Microsoft Word document whose content is dictated by the answers. I am not a professional programmer, and...
7
by: Michael Foord | last post by:
#!/usr/bin/python -u # 15-09-04 # v1.0.0 # auth_example.py # A simple script manually demonstrating basic authentication. # Copyright Michael Foord # Free to use, modify and relicense. #...
2
by: Steven O. | last post by:
First, this may not be the correct newsgroup. I have some relatively basic questions on SQL. I tried to find a newsgroup that was specifically just about SQL, and was surprised to find that all...
4
by: Ramesh | last post by:
hi, Let me ask some basic questions. Can anybody explain me about the following questions: 1. When we have to create sn key? Whenever we compiled Component we have to create or it is a one time...
3
by: Jim H | last post by:
If there is a site someone can point me to that answers such basic questions, rather than taking up support's time posting answers, please let me know. I've developed C# .NET, unmanaged C++, and...
2
by: Fay Yocum | last post by:
BEWARE beginner questions!! I have some experience in Access but never as much as I want or need. I have decided to get in on VB.Net. I would only rate myself in Access as a...
0
by: software2006 | last post by:
ASP And Visual Basic Interview questions and answers I have listed over 100 ASP and Visual Basic interview questions and answers in my website...
4
by: Goran Djuranovic | last post by:
Hi all, I am experiencing a strange thing happening with a "designer.vb" page. Controls I manually declare in this page are automatically deleted after I drop another control on a ".aspx" page. -...
2
by: LayneMitch via WebmasterKB.com | last post by:
Hello. This is a basic quiz. Only about 3 questions. I'm having issue with the answer key which stays on a certain value regardless of acknowledging that you have the correct answer for the...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
0
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.