Oracle FAQ Your Portal to the Oracle Knowledge Grid
HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US
 

Home -> Community -> Mailing Lists -> Oracle-L -> Re: Script to overcome ORA-54 during DDL

Re: Script to overcome ORA-54 during DDL

From: Stephane Faroult <sfaroult_at_roughsea.com>
Date: Fri, 25 Jun 2004 23:03:09 +0200
Message-ID: <40DC930D.7080403@roughsea.com>


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_at_speakeasy.net>
>To: <oracle-l_at_freelists.org>
>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_at_freelists.org
>put 'unsubscribe' in the subject line.
>--
>Archives are at http://www.freelists.org/archives/oracle-l/
>FAQ is at http://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_at_freelists.org put 'unsubscribe' in the subject line.
--
Archives are at http://www.freelists.org/archives/oracle-l/
FAQ is at http://www.freelists.org/help/fom-serve/cache/1.html
-----------------------------------------------------------------
Received on Fri Jun 25 2004 - 16:01:03 CDT

Original text of this message

HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US