2011-10-28 16 views
10

2 Domande separate.eliminazione di una tabella temporanea globale

  1. Sto usando questo script per eliminare una tabella [risolto]

    BEGIN 
        EXECUTE IMMEDIATE 'DROP TABLE_NAME'; 
        DBMS_OUTPUT.PUT_LINE ('Global table TABLE_NAME Dropped'); 
        EXCEPTION 
         WHEN OTHERS THEN 
          DBMS_OUTPUT.PUT_LINE ('Global table TABLE_NAME Doesn''t exist.'); 
    END; 
    /
    

C'è qualche cosa che posso distinguere se la tabella "non esiste" o viene utilizzato in qualche altre sessioni (in quel caso sarebbe bloccato e non può essere cancellato). Non sono sicuro di poter vedere che la tabella esista in user_tables. Non sono completamente a conoscenza delle autorizzazioni.

Ho aggiunto questo codice ora

WHEN OTHERS THEN 
     i_code := SQLCODE; 
     v_errm := SUBSTR(SQLERRM, 1, 64); 
    if i_code = -942 THEN 
    DBMS_OUTPUT.PUT_LINE ('TABLE_NAME doesn''t exist. Script will continue to create it'); 
    ELSE 
    DBMS_OUTPUT.PUT_LINE ('Error dropping temporary table. The error code is ' || i_code || '- ' || v_errm); 
    END IF ; 

2. vedo . al termine di ogni procedura come questa

END PROCEDURE_NAME; 
. 
/
sho err; 

io proprio non capisco perché . è qui. È sintassi o cosa?

+0

Il tavolo è davvero un tavolo temporaneo globale? ('crea una tabella temporanea globale ....') In caso affermativo, perché la lasci cadere? Questa parte di uno script di installazione? In caso contrario, forse un tavolo temporaneo globale potrebbe soddisfare le tue esigenze, senza bisogno di lasciarlo cadere. –

+0

bene ci siamo imbattuti in problema "già esistente" e in qualche modo, non è stato confermato da ambiente di productino qual è lo stato della tabella. Questa tabella non fa parte dello script di installazione fa parte di una procedura separata. –

+0

Non capisco, perché hai incontrato un problema già esistente con una tabella temporanea globale. La tabella dovrebbe già esistere e il codice usa (inserire, eliminare, aggiornare, ecc.). –

risposta

12

Fase 1. Capire quali errori si vuole intrappolare:

Se la tabella non esiste:

SQL> drop table x; 
drop table x 
      * 
ERROR at line 1: 
ORA-00942: table or view does not exist 

Se la tabella è in uso:

SQL> create global temporary table t (data varchar2(4000)); 

Table created. 

Utilizzare la tabella in un'altra sessione. (Avviso non commettere o nulla dopo l'inserto.)

SQL> insert into t values ('whatever'); 

1 row created. 

Torna nella prima sessione, il tentativo di cadere:

SQL> drop table t; 
drop table t 
      * 
ERROR at line 1: 
ORA-14452: attempt to create, alter or drop an index on temporary table already in use 

così i due errori di intrappolare:

  1. ora- 00942: tabella o vista non esiste
  2. ORA-14452: tentativo di creare, modificare o eliminare un indice su tabella temporanea già in uso

Vedere se gli errori sono predefined. Non lo sono.Quindi hanno bisogno di essere definita in questo modo:

create or replace procedure p as 
    table_or_view_not_exist exception; 
    pragma exception_init(table_or_view_not_exist, -942); 
    attempted_ddl_on_in_use_GTT exception; 
    pragma exception_init(attempted_ddl_on_in_use_GTT, -14452); 
begin 
    execute immediate 'drop table t'; 

    exception 
     when table_or_view_not_exist then 
      dbms_output.put_line('Table t did not exist at time of drop. Continuing....'); 

     when attempted_ddl_on_in_use_GTT then 
      dbms_output.put_line('Help!!!! Someone is keeping from doing my job!'); 
      dbms_output.put_line('Please rescue me'); 
      raise; 
end p; 

E i risultati, prima senza t:

SQL> drop table t; 

Table dropped. 

SQL> exec p; 
Table t did not exist at time of drop. Continuing.... 

PL/SQL procedure successfully completed. 

E ora, con t in uso:

SQL> create global temporary table t (data varchar2(4000)); 

Table created. 

In un'altra sessione:

SQL> insert into t values (null); 

1 row created. 

E poi nella prima sessione:

SQL> exec p; 
Help!!!! Someone is keeping from doing my job! 
Please rescue me 
BEGIN p; END; 

* 
ERROR at line 1: 
ORA-14452: attempt to create, alter or drop an index on temporary table already in use 
ORA-06512: at "SCHEMA_NAME.P", line 16 
ORA-06512: at line 1 
-1

sì - il motore genererà eccezioni diverse per condizioni diverse.

cambierai questa parte per catturare l'eccezione e fare qualcosa di diverso

EXCEPTION 
     WHEN OTHERS THEN 

ecco un riferimento

http://download.oracle.com/docs/cd/B10501_01/appdev.920/a96624/07_errs.htm

+0

Questa è la domanda. Quale sarebbe un'altra eccezione per questo qui (http://download.oracle.com/docs/cd/B10501_01/appdev.920/a96624/07_errs.htm) –

-1

L'istruzione Declare TEMPORARY TABLE GLOBAL definisce una tabella temporanea per la connessione corrente.

Queste tabelle non risiedono nei cataloghi di sistema e non sono persistenti.

Le tabelle temporanee esistono solo durante la connessione che li ha dichiarati e non possono essere referenziati al di fuori di tale connessione.

Quando la connessione si chiude, le righe della tabella vengono eliminate e la descrizione in memoria della tabella temporanea viene eliminata.

Per il vostro riferimento http://docs.oracle.com/javadb/10.6.2.1/ref/rrefdeclaretemptable.html

+0

Stai parlando di un prodotto database diverso da OP. Per Oracle Database http://docs.oracle.com/database/121/CNCPT/tablecls.htm#CNCPT1138. & "In Oracle le tabelle temporanee globali sono oggetti permanenti che memorizzano dati specifici della sessione temporanea (o specifici della transazione)." http://stackoverflow.com/questions/3682360/sql-server-oracle-private-temporary-tables –

15
 
-- First Truncate temporary table 
SQL> TRUNCATE TABLE test_temp1; 

-- Then Drop temporary table 
SQL> DROP TABLE test_temp1; 
+2

Questa soluzione non funziona. – zygimantus

+0

Ha funzionato nel mio caso dopo aver ricollegato (cambiando la sessione). –

0
  1. il server Apache eseguendo sotto nella putty cd $ADMIN_SCRIPTS_HOME ./adstpall.sh
  2. eliminare le tabelle globali temporanee drop table t;

Questo allenamento volontà.

Problemi correlati