在作业中使用全局临时表

时间:2011-10-25 08:47:16

标签: oracle plsql oracle9i temp-tables

我正在开发一个PL-SQL存储过程,它将根据日常工作运行。 在存储过程中,我试图使用像这样的全局临时表:

CREATE GLOBAL TEMPORARY TABLE A_Table 
ON COMMIT PRESERVE ROWS 
AS SELECT * from B_Table

然后我会尝试创建这样的索引:

CREATE INDEX idx_a ON A_Table (id)

我有两个问题:

  1. 我创建的表始终为空:因此存储过程中的所有计算都将为零。
  2. 当我尝试创建索引时出现此错误:

    ORA-14452:尝试在已使用的临时表上创建,更改或删除索引

  3. 有什么建议吗?

    最好的问候

3 个答案:

答案 0 :(得分:3)

  1. 放在临时表中的任何数据只会用于会话的其余部分(如果指定on commit delete rows,则为事务)。如果要在会话之间存储数据,请使用普通表。

  2. 关闭使用临时表的会话,然后重试。

答案 1 :(得分:1)

你提到你正在创建临时表但是你可能已经创建了一次,并且每次运行plsql代码时都不会尝试重新创建它,并且索引定义也可以保留在临时表中 - 这也不需要创建每次运行代码。

全局临时表具有静态定义 - 您只需创建它并且它就在那里但它不会生成重做/撤消,并且其中包含的数据仅对填充它的会话可见。

    SQL*Plus: Release 10.1.0.4.2 - Production on Wed Oct 26 01:22:30 2011

    Copyright (c) 1982, 2005, Oracle.  All rights reserved.


    Connected to:
    Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production

    SQL> create global temporary table test (name varchar2(20));

    Table created.

    SQL> insert into test values ('one');

    1 row created.

    SQL> insert into test values ('two');

    1 row created.

    SQL> select * from test;

    NAME
    --------------------
    one
    two

然后在另一个会话中

    SQL*Plus: Release 10.1.0.4.2 - Production on Wed Oct 26 01:23:17 2011

    Copyright (c) 1982, 2005, Oracle.  All rights reserved.


    Connected to:
    Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production

    SQL> select * from test;

    no rows selected

    SQL> insert into test values ('three');

    1 row created.

    SQL> select * from test;

    NAME
    --------------------
    three

回到第一次会议         SQL>提交;

    Commit complete.

    SQL> select * from test;

    no rows selected

    SQL> drop table test;
    drop table test
               *
    ERROR at line 1:
    ORA-14452: attempt to create, alter or drop an index on temporary table already
    in use

因为我们在第二个会话中插入了数据,所以我们无法对临时表做任何事情 直到我们在第二个会话中提交,然后丢弃成功

您可以选择在提交(提交删除行)时保留为创建它的会话清除内容,或者保留数据直到会话终止(在提交保留行上)。

答案 2 :(得分:0)

  1. 您创建的表可能不是空的,但仅适用于填充它的会话。可以说,每个会话都有自己的临时表实例。顺便说一下,这是临时表的主要特征。

  2. 临时修改table是不可能的,而曾经使用过它的任何会话都是活着的(可能没有活动)