2011-10-28 22 views
10

2 Preguntas separadas.soltando una tabla temporal global

  1. estoy usando este script para eliminar una tabla [Resuelto]

    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; 
    /
    

¿Hay alguna forma de diferenciar si la tabla "no existe" o que se está utilizando en algunos otras sesiones (en ese caso se bloquearía y no se podría eliminar). No estoy seguro si puedo ver que la tabla existe en user_tables. No estoy completamente consciente de los permisos.

He añadido este código ahora

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. Veo . al final de cada procedimiento como éste

END PROCEDURE_NAME; 
. 
/
sho err; 

simplemente no entiendo por qué . está aquí. ¿Es sintaxis o qué?

+0

¿Es la tabla realmente una tabla temporal global? ('create global temporary table .... ') Si es así, ¿por qué lo dejas caer? ¿Es esto parte de un script de instalación? De lo contrario, tal vez una tabla temporal global satisfaga sus necesidades, sin necesidad de descartarla. –

+0

bien nos encontramos con el problema de "ya existe" y, de alguna manera, no está confirmado desde el entorno productino cuál es el estado de la tabla. Esta tabla no forma parte del script de instalación y forma parte del procedimiento por separado. –

+0

No entiendo, ¿por qué se topó con un problema ya existente con una tabla temporal global? La tabla ya debería existir, y el código solo usa (insertar, eliminar, actualizar, etc.). –

Respuesta

12

Paso 1. Averiguar qué errores desea trampa:

Si la tabla no existe:

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

Si la tabla está en uso:

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

Table created. 

Use la tabla en otra sesión. (Notificación no cometer ni nada después de la inserción.)

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

1 row created. 

De vuelta en la primera sesión, el intento de colocar:

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 

así que los dos errores de atrapar:

  1. ORA 00942: tabla o vista no existe
  2. ORA-14452: intente crear , modifique o suelte un índice en la tabla temporal que ya está en uso

Ver si los errores son predefined. Ellos no sonPor lo que necesitan ser definidos así:

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; 

Y los resultados, primero sin 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. 

Y ahora, con t en uso:

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

Table created. 

En otra sesión:

SQL> insert into t values (null); 

1 row created. 

Y luego, en la primera sesión:

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í - el motor arrojará diferentes excepciones para diferentes condiciones.

que va a cambiar esta parte para detectar la excepción y hacer algo diferente

EXCEPTION 
     WHEN OTHERS THEN 

aquí es una referencia

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

+0

Esa es la pregunta. ¿Cuál sería otra excepción para esto aquí (http://download.oracle.com/docs/cd/B10501_01/appdev.920/a96624/07_errs.htm) –

-1

La sentencia DECLARE GLOBAL TEMPORARY TABLE define una tabla temporal para la conexión actual.

Estas tablas no residen en los catálogos del sistema y no son persistentes.

Las tablas temporales existen solo durante la conexión que las declaró y no se puede hacer referencia fuera de esa conexión.

Cuando se cierra la conexión, se eliminan las filas de la tabla y se descarta la descripción en memoria de la tabla temporal.

Para su referencia http://docs.oracle.com/javadb/10.6.2.1/ref/rrefdeclaretemptable.html

+0

Está hablando de un producto de base de datos diferente a OP. Para la base de datos Oracle http://docs.oracle.com/database/121/CNCPT/tablecls.htm#CNCPT1138. & "En Oracle, las tablas temporales globales son objetos permanentes que almacenan datos de sesiones temporales específicas (o específicas de la transacción)". 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

Esta solución no funciona. – zygimantus

+0

funcionó en mi caso después de volver a conectar (cambiar la sesión). –

0
  1. el servidor Apache ejecutando a continuación en putty cd $ADMIN_SCRIPTS_HOME ./adstpall.sh
  2. eliminar las tablas temporales globales drop table t;

Este entrenamiento voluntad.

Cuestiones relacionadas