I thought it was pretty good for five minutes - and I did leave in a CPU-saving sleep. The timeout problem is left as an exercise for the reader. Held cursors shouldn't be a problem - that's why library cache locks are called breakable parse locks. ("should" and "won't" are, of course, two different words). Regards Jonathan Lewis http://www.jlcomp.demon.co.uk http://www.jlcomp.demon.co.uk/faq/ind_faq.html The Co-operative Oracle Users' FAQ http://www.jlcomp.demon.co.uk/seminar.html Optimising Oracle Seminar - schedule updated May 1st ----- Original Message ----- From: "Stephane Faroult" <sfaroult@xxxxxxxxxxxx> To: <oracle-l@xxxxxxxxxxxxx> Sent: Friday, June 25, 2004 10:03 PM Subject: Re: Script to overcome ORA-54 during DDL I am not sure that in some cases this couldn't loop for much longer than expected, and I'd definitely put a limit on the number of iterations. The problem is chiefly what is executing the DML, and how. Remember that Pro*C keeps cursors open even when they are closed in the program - unless you explicitly ask for them to be released. That was the case at least the last time I used Pro*C, which is admittedly a long time ago. I distinctly remember a problem I once had of trying to drop a table after having queried it, in spite of the SELECT cursor being quite properly closed. For what I remember of Forms and max_open_cursors being bumped to astronomical levels, Pro*C isn't alone in this case. No such problem if the DML is issued from SQL*Plus, which only handles a single cursor, but the programs accessing the table may be slightly more sophisticated. SF Jonathan Lewis wrote: >This looks about right (except for the formatting); > >create or replace procedure do_ddl(m_sql varchar2) >as > in_use exception ; > pragma exception_init(in_use, -54); >begin > while true loop > begin > execute immediate m_sql; > exit; > exception > when in_use then null; > when others then raise; > end; > dbms_lock.sleep(0.01); > end loop; >end; >/ > >Regards > >Jonathan Lewis > >http://www.jlcomp.demon.co.uk > >http://www.jlcomp.demon.co.uk/faq/ind_faq.html >The Co-operative Oracle Users' FAQ > >http://www.jlcomp.demon.co.uk/seminar.html >Optimising Oracle Seminar - schedule updated May 1st > > >----- Original Message ----- >From: "Jeremiah Wilton" <jwilton@xxxxxxxxxxxxx> >To: <oracle-l@xxxxxxxxxxxxx> >Sent: Friday, June 25, 2004 7:55 PM >Subject: Script to overcome ORA-54 during DDL > > >Sometimes when trying to perform DDL on really hot objects (heavy >read/DML), I get: > >ORA-00054: resource busy and acquire with NOWAIT specified. > >I guess this is because you need to obtain a library cache lock in >order to change the object definition. Since there is no enqueue >mechanism for this resource, you can't just 'lock table ... in >exclusive mode;' All that gives you is a DML lock. > >One way to avoid this is to write a PL/SQL routine that uses DBMS_SQL >and spins trying to run the DDL, stopping only when it succeeds. This >seems to work most of the time. > >Does anyone have a script for doing the above that they would like to >share? > >Please don't tell me to just use dbms_redefinition. That is >unnecessarily complex when the above technique can be used instead. > >Thanks > >-- >Jeremiah Wilton > > >---------------------------------------------------------------- >Please see the official ORACLE-L FAQ: http://www.orafaq.com >---------------------------------------------------------------- >To unsubscribe send email to: oracle-l-request@xxxxxxxxxxxxx >put 'unsubscribe' in the subject line. >-- >Archives are at //www.freelists.org/archives/oracle-l/ >FAQ is at //www.freelists.org/help/fom-serve/cache/1.html >----------------------------------------------------------------- > > > ---------------------------------------------------------------- Please see the official ORACLE-L FAQ: http://www.orafaq.com ---------------------------------------------------------------- To unsubscribe send email to: oracle-l-request@xxxxxxxxxxxxx put 'unsubscribe' in the subject line. -- Archives are at //www.freelists.org/archives/oracle-l/ FAQ is at //www.freelists.org/help/fom-serve/cache/1.html ----------------------------------------------------------------- ---------------------------------------------------------------- Please see the official ORACLE-L FAQ: http://www.orafaq.com ---------------------------------------------------------------- To unsubscribe send email to: oracle-l-request@xxxxxxxxxxxxx put 'unsubscribe' in the subject line. -- Archives are at //www.freelists.org/archives/oracle-l/ FAQ is at //www.freelists.org/help/fom-serve/cache/1.html -----------------------------------------------------------------