Удаление глобальной временной таблицы

2 Отдельные вопросы.

  • Я использую этот script для удаления таблицы [SOLVED]

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

В любом случае, я могу различать, если таблица "не существует" или используется в некоторых других сеансах (в этом случае она блокируется и не может быть удалена). Я не уверен, могу ли я видеть, что таблица существует в user_tables. Я не полностью осведомлен о разрешениях.

Я добавил этот код сейчас

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. Я вижу . в конце каждой процедуры, подобной этой

END PROCEDURE_NAME;
.
/
sho err;

Я просто не понимаю, почему . здесь. Это синтаксис или что?

Ответ 1

Шаг 1. Выясните, какие ошибки вы хотите уловить:

Если таблица не существует:

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

Если таблица используется:

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

Table created.

Используйте таблицу в другом сеансе. (Обратите внимание, что никакая фиксация или что-либо после вставки.)

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

1 row created.

Вернуться в первый сеанс, попытайтесь отбросить:

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

Итак, две ошибки для ловушки:

  • ORA-00942: таблица или представление не существует
  • ORA-14452: попытка создавать, изменять или удалять индекс во временной таблице, которая уже используется

Убедитесь, что ошибки предопределены. Это не так. Поэтому они должны быть определены следующим образом:

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;

И результаты, сначала без 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.

И теперь, используя t:

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

Table created.

В другом сеансе:

SQL> insert into t values (null);

1 row created.

И затем в первом сеансе:

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

Ответ 2

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

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

Ответ 3

  • Вниз сервер Apache, выполнив ниже в putty cd $ADMIN_SCRIPTS_HOME ./adstpall.sh
  • Удалить глобальные временные таблицы drop table t;

Это будет тренировка.

Ответ 4

да - двигатель выдаст разные исключения для разных условий.

вы измените эту часть, чтобы поймать исключение и сделать что-то другое

  EXCEPTION
      WHEN OTHERS THEN

здесь есть ссылка

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

Ответ 5

Оператор DECLARE GLOBAL TEMPORARY TABLE определяет временную таблицу для текущего соединения.

Эти таблицы не находятся в системных каталогах и не являются постоянными.

Временные таблицы существуют только во время соединения, объявившего их, и не могут быть указаны за пределами этого соединения.

Когда соединение закрывается, строки таблицы удаляются, а описание временной таблицы в памяти уменьшается.

Для справки http://docs.oracle.com/javadb/10.6.2.1/ref/rrefdeclaretemptable.html