удаление глобальной временной таблицы - PullRequest
10 голосов
/ 28 октября 2011

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

  1. Я использую этот скрипт для удаления таблицы [решено]

    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;

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

Ответы [ 5 ]

16 голосов
/ 08 мая 2015
-- First Truncate temporary table
SQL> TRUNCATE TABLE test_temp1;

-- Then Drop temporary table
SQL> DROP TABLE test_temp1;
14 голосов
/ 28 октября 2011

Шаг 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

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

  1. ORA-00942: таблица или представление не существует
  2. 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
0 голосов
/ 02 января 2018
  1. Завершите работу сервера Apache, запустив ниже в putty cd $ADMIN_SCRIPTS_HOME ./adstpall.sh
  2. Удаление глобальных временных таблиц drop table t;

Это будет работать..

0 голосов
/ 11 февраля 2015

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

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

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

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

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

0 голосов
/ 28 октября 2011

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

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

  EXCEPTION
      WHEN OTHERS THEN

вот ссылка

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

...