programing

글로벌 임시 테이블 삭제

goodsources 2023. 8. 29. 20:29
반응형

글로벌 임시 테이블 삭제

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 ;

그렇군요. 이렇게 각각의 절차가 끝날 때마다.

END PROCEDURE_NAME;
.
/
sho err;

.가 왜 여기 있는지 이해할 수가 없어요.구문인가요?

첫 번째 임시 테이블 잘라내기SQL > TRUNKATE TABLE test_temp1;
그런 다음 임시 테이블 삭제SQL> DROP TABLE test_temp1;

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

예 - 엔진이 다양한 조건에 대해 서로 다른 예외를 던집니다.

이 부분을 변경하여 예외를 포착하고 다른 작업을 수행합니다.

  EXCEPTION
      WHEN OTHERS THEN

여기 참고 자료가 있습니다.

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

DELLARE GLOBAL TEMPORY TABLE 문은 현재 연결에 대한 임시 테이블을 정의합니다.

이러한 테이블은 시스템 카탈로그에 있지 않으며 영구적이지 않습니다.

임시 테이블은 해당 테이블을 선언한 연결 중에만 존재하며 해당 연결 외부에서는 참조할 수 없습니다.

연결이 닫히면 테이블의 행이 삭제되고 임시 테이블의 메모리 내 설명이 삭제됩니다.

참고로 http://docs.oracle.com/javadb/10.6.2.1/ref/rrefdeclaretemptable.html .

  1. 아래를 실행하여 Apache 서버를 다운받습니다.putty cd $ADMIN_SCRIPTS_HOME ./adstpall.sh
  2. 전역 임시 테이블을 삭제합니다.drop table t;

잘 될 거예요.

언급URL : https://stackoverflow.com/questions/7932977/dropping-a-global-temporary-table

반응형