| Oracle FAQ | Your Portal to the Oracle Knowledge Grid | |
Home -> Community -> Mailing Lists -> Oracle-L -> Re: fetch across commit
Hi all,
Have any of you considered using a 'where current of' update cursor to work around this?
I've used it in the past to avoid both ora-1555 and 'fetch across commit'.
Here's a bit of code with an example, stripped to the relevant parts.
It would of course be a good idea not to commit every row as this code is doing.
cursor csr_dblink
is
select
instance, username, table_owner, table_name,
precedence, db_link_instance, db_link_username,
rowid
from data_sources;
cursor csr_dblink_upd ( rowid_in rowid )
is
select
instance, username, table_owner, table_name,
precedence, db_link_instance, db_link_username,
remote_instance, remote_table_name, remote_table_owner
from data_sources
where rowid = rowid_in
for update;
csr_dblink_upd_rec csr_dblink_upd%rowtype;
for dblinkrec in csr_dblink
loop
if csr_dblink_upd%isopen then
close csr_dblink_upd;
end if;
open csr_dblink_upd(dblinkrec.rowid);
fetch csr_dblink_upd into csr_dblink_upd_rec;
if csr_dblink_upd%notfound then
raise_application_error(-20100,'could not find
current record');
end if;
update data_sources
set
remote_instance = remote_instance_inout,
remote_table_name = remote_table_name_inout,
remote_table_owner = remote_table_owner_inout
where current of csr_dblink_upd;
if csr_dblink_upd%isopen then
close csr_dblink_upd;
end if;
commit;
end loop;
Jared
On Tue, 30 Nov 2004 09:44:38 -0500, Goulet, Dick <dgoulet_at_vicr.com> wrote:
> Ganesh,
>
> The answer is yes and no. According to the SQL standard once a
> commit is issues all open cursors are invalid & need reopening. Oracle,
> being the NICE dbms that it is allows us to do otherwise. The problem
> is that the current SCN of your session is no longer the same as that of
> your cursor and you've released all interest in rollback segments before
> the now current scn. Although it is much more common to have the
> problem caused by a second session updating the cursor table, the insert
> table can also be affected. Delayed Block Cleanout is one potential
> culprit, the second can become a integrity constraint check or an index
> update or some other matter. OTS has at one time pointed me to a data
> dictionary update as the problem. Namely if you create the insert table
> with very small extents then getting that third or fourth extent can
> cause the problem. The answer in my case was to create the insert table
> with one very large initial extent.
>
>
-- Jared Still Certifiable Oracle DBA and Part Time Perl Evangelist -- http://www.freelists.org/webpage/oracle-lReceived on Tue Nov 30 2004 - 09:04:38 CST
![]() |
![]() |