What I don't understand is the loop construction:
Actually only one (row) is read form the cursor, and then the function is
left with a return. Because it's an unconditional return, the code within
the loop will either execute once, or never. When no data is found
NULL is returned. When an error occurs NULL is returned as well. So, why
a loop?
Wouldn't it be better to have something like:
create or replace function XYZ(gid in number) return varchar2 is
l_c1 tab1.C1%TYPE; /* local variable
to store C1 */
begin
select c1
into l_c1
from tab1
where id = gid;
return l_c1;
exception
when no_data_found
then return <some_error_code>; /* let the
caller know that no data is found */
when others
then return 'ERROR: '||TO_CHAR(SQLCODE); /* return the
error-code, preceded by the text ERROR for identification */
end;
Sure, a loop prevents an ORA-1422, but I don't think a loop construction
should be abused for this. Just think about all loop controlling code
that needs to be set up by the interpreter. tab1.ID should be unique, so
a 1422 normally cannot occur. Robust programming however asks us to
prevent any error. I would prefer to think about how a 1422 should be
handled, and write some code accordingly.
Regards, Carel-Jan
===
If you think education is expensive, try ignorance. (Derek Bok)
===
At 09:39 28-12-03 -0800, you wrote:
Hi
if we assume it is implements this way (see below) there will
only be one cursor since c_gid
is a bind variable and there for the cursor will be sharded from
call to call of the function.
create or replace function XYZ (gid in number) return varchar2 is
cursor cur1(c_gid number) is select C1 from tab1 where id =
c_gid;
begin
for x in cur1(gid) loop
return x.c1;
end loop;
return null;
exception
when others then return null;
end;
It will only be one coursor
Guang Mei wrote:
I have a function like below (psudo code). If cursor cur1 have
multiple
rows, would the code leave the cursor open when this function is
called?
So if this function is called 1000 times, I would have 1000 open
cursors?
function XYZ(gid in number) return varchar2 is
cursor cur1 is select C1 from tab1 where ID = gid;
begin
for x in cur1 loop
return x.c1;
end loop;
return null;
exception
when others then return null;
end;
--
Best regards/Venlig hilsen
Peter Gram
Miracle A/S
Kratvej 2
DK - 2760 Måløv
Cell: (+45) 2527 7107
Phone: (+45) 4466 8855
Fax: (+45) 4466 8856
Home: (+45) 3874 5696
Email: peter.gram@miracleas.dk
--
Please see the official ORACLE-L FAQ: http://www.orafaq.net
--
Author: Carel-Jan Engel
INET: cjpengel.dbalert_at_xs4all.nl
Fat City Network Services -- 858-538-5051 http://www.fatcity.com
San Diego, California -- Mailing list and web hosting services
---------------------------------------------------------------------
To REMOVE yourself from this mailing list, send an E-Mail message
to: ListGuru_at_fatcity.com (note EXACT spelling of 'ListGuru') and in
the message BODY, include a line containing: UNSUB ORACLE-L
(or the name of mailing list you want to be removed from). You may
also send the HELP command for other information (like subscribing).
Received on Sun Dec 28 2003 - 13:39:25 CST