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

Home -> Community -> Usenet -> c.d.o.server -> Re: truncate randomly failing

Re: truncate randomly failing

From: Matthias Rogel <rogel_at_web.de>
Date: Tue, 10 Dec 2002 07:11:59 +0100
Message-ID: <at40jf$10b2ku$1@ID-86071.news.dfncis.de>


Erika,

what do you mean by "(the loop of 1..100 was simply added to make it more likely for the truncate to succeed)"

what can go wrong in a truncate ?

truncate first tries to put an exclusive lock on the table (correct me if I am wrong), then truncates it.

if it is not possible to lock the table, ORA-00054 is thrown. ("ORA-00054: Versuch, mit NOWAIT eine bereits belegte Ressource anzufordern.")

Please note, that Oracle doesn't wait for a table lock.

Daniel: this is exactly the difference when you put the lock into the code. With the lock in the code, you don't get an ORA-00054. Instead of it, Oracle waits until the table is locked. Then, the truncate will succeed.

Matthias

damorgan wrote:

> Erika wrote:
> 
> 

>>hi,
>>I am really not an expert in this (more like a beginner), but doesn't
>>the truncate automatically lock the table in an exclusive mode? Why do
>>you think that locking the table explicitly would help my problem?
>>(the loop of 1..100 was simply added to make it more likely for the
>>truncate to succeed)
>>thanks
>>Erika
>>
>>Matthias Rogel <rogel_at_web.de> wrote in message news:<at2dq3$v8c4s$1_at_ID-86071.news.dfncis.de>...
>>
>>>hi erika,
>>>
>>>interesting procedure.
>>>
>>>why don't you simply use
>>>
>>>procedure truncate_table (p_tname in varchar2)
>>>as
>>>begin
>>> execute immediate 'lock table '||p_tname || ' IN EXCLUSIVE MODE';
>>> execute immediate 'truncate table '||p_tname;
>>>end;
>>>
>>>???
>>>
>>>
>>>
>>>
>>>Erika wrote:
>>>
>>>>I am having some problems with truncating tables with a procedure, and
>>>>I just can't figure out why.
>>>>I am calling the following procedure to truncate the tables:
>>>>
>>>>procedure truncate_table (p_tname in varchar2)
>>>>as
>>>>begin
>>>> for i in 1 ..100
>>>> loop
>>>> begin
>>>> execute immediate 'truncate table '||p_tname;
>>>> exit;
>>>> exception
>>>> when others then if (i=100) then RAISE; end if;
>>>> end;
>>>> end loop;
>>>>end;
>>>>
>>>>
>>>>It fails randomly (at least it seems random), for different users and
>>>>different tables. The error message is: ORA-00942: table or view
>>>>does not exist.
>>>>
>>>>It can't be a permission problem because the same table/user
>>>>combination works most of the time, but fails sometimes.
>>>>I wasn't able to observe any pattern of when does it happen and why,
>>>>except that it seems to happen during heavy-use periods.
>>>>
>>>>Thank you for your help
>>>>
>>>>Erika
>>>
> 
> The lock should come out of the code. It is doing nothing of value.
> 
> Who owns the tables? How are rights to the tables granted?
> 
> Are you sure these users have the granted privilege to perform these truncates?
> 
> And if they do ... what is wrong with the design that they do?
> 
> Daniel Morgan
> 
Received on Tue Dec 10 2002 - 00:11:59 CST

Original text of this message

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