web-dev-qa-db-ja.com

グローバル一時テーブルの削除

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;

がここにある理由がわかりません。構文ですか?

11
x.509

手順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

したがって、トラップする2つのエラー:

  1. ORA-00942:表またはビューが存在しません
  2. ORA-14452:すでに使用されている一時表の索引を作成、変更または削除しようとしました

エラーが predefined であるかどうかを確認します。そうではありません。そのため、次のように定義する必要があります。

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
15
-最初の一時テーブルの切り捨て
 SQL> TRUNCATE TABLE test_temp1; 
 
-その後、一時テーブルの削除
 SQL> DROP TABLE test_temp1; 
15
Nader
  1. 以下でPuTTYcd $ADMIN_SCRIPTS_HOME./adstpall.shを実行してApacheサーバーを停止します
  2. グローバル一時テーブルを削除しますdrop table t;

これはうまくいきます。

0
Suresh Kalvoj