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

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;

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


person x.509    schedule 28.10.2011    source источник
comment
Действительно ли таблица является глобальной временной таблицей? (create global temporary table ....) Если да, то почему вы его бросаете? Является ли это частью сценария установки? Если нет, возможно, глобальная временная таблица удовлетворит ваши потребности без необходимости ее удаления.   -  person Shannon Severance    schedule 28.10.2011
comment
ну, мы столкнулись с уже существующей проблемой, и каким-то образом из среды productino не было подтверждено, каково состояние таблицы. Эта таблица не является частью сценария установки, а является частью отдельной процедуры.   -  person x.509    schedule 28.10.2011
comment
Я не понимаю, почему вы столкнулись с уже существующей проблемой с глобальной временной таблицей. Таблица уже должна существовать, и код просто использует ее (вставляет, удаляет, обновляет и т. д.).   -  person Shannon Severance    schedule 28.10.2011
comment
Ответ @Nader работает на меня   -  person yu yang Jian    schedule 16.03.2021


Ответы (5)


Шаг 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
person Shannon Severance    schedule 28.10.2011

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

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

  EXCEPTION
      WHEN OTHERS THEN

вот ссылка

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

person Randy    schedule 28.10.2011
comment
Это вопрос. Что было бы другим исключением для этого здесь (download.oracle .com/docs/cd/B10501_01/appdev.920/a96624/) - person x.509; 28.10.2011

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

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

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

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

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

person PL SHARMA    schedule 11.02.2015
comment
Вы говорите о другом продукте базы данных, чем OP. Для базы данных Oracle docs.oracle.com/database/121/CNCPT/tablecls .htm#CNCPT1138. & В Oracle глобальные временные таблицы являются постоянными объектами, в которых хранятся временные данные, относящиеся к сеансу (или к транзакции). stackoverflow.com/questions/3682360/ - person Shannon Severance; 19.05.2015

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

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

person Suresh Kalvoj    schedule 02.01.2018

person    schedule
comment
В моем случае это сработало после переподключения (изменения сеанса). - person daniel.kahlenberg; 27.02.2017
comment
Это лучший ответ! - person yu yang Jian; 16.03.2021