我正在开发一个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)
我有两个问题:
当我尝试创建索引时出现此错误:
ORA-14452:尝试在已使用的临时表上创建,更改或删除索引
有什么建议吗?
最好的问候
答案 0 :(得分:3)
放在临时表中的任何数据只会用于会话的其余部分(如果指定on commit delete rows
,则为事务)。如果要在会话之间存储数据,请使用普通表。
关闭使用临时表的会话,然后重试。
答案 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)
您创建的表可能不是空的,但仅适用于填充它的会话。可以说,每个会话都有自己的临时表实例。顺便说一下,这是临时表的主要特征。
临时修改table是不可能的,而曾经使用过它的任何会话都是活着的(可能没有活动)