премахване на глобална временна таблица

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 Database 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