删除全局临时表

时间:2011-10-28 17:54:10

标签: oracle plsql ddl temp-tables

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;
    /
    
  2. 无论如何,如果表“不存在”或者在某些其他会话中使用它(在这种情况下它将被锁定且无法删除),我可以区分。我不确定我是否可以在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 个答案:

答案 0 :(得分:15)

-- First Truncate temporary table
SQL> TRUNCATE TABLE test_temp1;

-- Then Drop temporary table
SQL> DROP TABLE test_temp1;

答案 1 :(得分:13)

步骤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:尝试 在已使用的临时表上创建,更改或删除索引
  3. 查看错误是否为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
    

答案 2 :(得分:0)

  1. putty下方运行,关闭apache服务器 cd $ADMIN_SCRIPTS_HOME ./adstpall.sh
  2. 删除全局临时表 drop table t;
  3. 这将锻炼..

答案 3 :(得分:-1)

是的 - 引擎会针对不同的条件抛出不同的异常。

您将更改此部分以捕获异常并执行不同的操作

  EXCEPTION
      WHEN OTHERS THEN

这是一个参考

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

答案 4 :(得分:-1)

DECLARE GLOBAL TEMPORARY TABLE语句为当前连接定义临时表。

这些表不驻留在系统目录中,并且不是持久性的。

临时表仅在声明它们的连接期间存在,并且不能在该连接之外引用。

当连接关闭时,将删除表的行,并删除临时表的内存中描述。

供参考http://docs.oracle.com/javadb/10.6.2.1/ref/rrefdeclaretemptable.html