ORACLE:我们可以创建全局临时表或存储过程中的任何表吗?

问题描述:

下面

是存储过程我写道:ORACLE:我们可以创建全局临时表或存储过程中的任何表吗?

create or replace procedure test005 
as 
begin 

CREATE GLOBAL TEMPORARY TABLE TEMP_TRAN 
( 
COL1 NUMBER(9), 
COL2 VARCHAR2(30), 
COL3 DATE 
) ON COMMIT PRESERVE ROWS 

/
INSERT INTO TEMP_TRAN VALUES(1,'D',sysdate); 

INSERT INTO TEMP_TRAN VALUES(2,'I',sysdate); 

INSERT INTO TEMP_TRAN VALUES(3,'s',sysdate); 

COMMIT; 
end; 

当我执行它,我收到一条错误消息提的是:

create or replace procedure test005 
as 
begin 

CREATE GLOBAL TEMPORARY TABLE TEMP_TRAN 
( 
COL1 NUMBER(9), 
COL2 VARCHAR2(30), 
COL3 DATE 
) ON COMMIT PRESERVE ROWS 

/
INSERT INTO TEMP_TRAN VALUES(1,'D',sysdate); 

INSERT INTO TEMP_TRAN VALUES(2,'I',sysdate); 

INSERT INTO TEMP_TRAN VALUES(3,'s',sysdate); 

COMMIT; 
end; 
Error at line 1 
ORA-00955: name is already used by an existing object 

Script Terminated on line 1. 

我试着放下TEMP_TRAN和它说表不存在。所以系统中不存在TEMP_TRAN表。为什么我得到这个错误?我正在使用TOAD创建这个存储过程。

任何帮助将不胜感激。

+0

该脚本不会创建有效的存储过程,因此您无法执行它。您可以执行脚本,但它会失败以创建可以运行的有效过程。 – 2010-04-22 15:52:13

全局临时表并不是要通过存储过程“实时”创建的。它们将永久性地创建一次,就像任何其他表一样。它是临时的数据,而不是表格对象。

关于TEMP_TRAN,也许是名称的对象存在,但不是?试试这个:

select * from all_objects where object_name = 'TEMP_TRAN'; 

您是否试过这个查询?

select * from all_tables where table_name like '%TEMP_TRAN%' 

如果是这样,是表中列出?

另一种方法是使用EXECUTE IMMEDIATE语句。

CREATE OR REPLACE PROCEDURE P_TEST005 AS 
v_Exists NUMBER; 
BEGIN 
    v_Exists := 0; 
    SELECT 1 INTO v_Exists 
     FROM ALL_TABLES 
     WHERE TABLE_NAME LIKE '%TEMP_TRAN%'; 

    IF v_Exists = 1 THEN 
     EXECUTE IMMEDIATE "DROP TABLE TEMP_TRAN"; 
    ENDIF 

    EXECUTE IMMEDIATE 
     "CREATE GLOBAL TEMPORARY TABLE TEMP_TRAN (
      COL1 NUMBER(9), 
      COL2 VARCHAR2(30), 
      COL3 DATE 
     ) ON COMMIT PRESERVE ROWS" 

    EXCEPTION 
     WHEN OTHERS THEN 
      NULL; 
END; 

请考虑我生锈的Oracle技能。我现在还没有和甲骨文合作过2年。但是,如果你按照自己的方式工作,你可能会达到你想要做的。

但是,我确实同意临时表并不意味着要被过程删除,而是像普通表一样存在。

+0

不需要“解决”问题 - 正如您所说,临时表不应该被程序创建或删除。 (你几乎从我身上得到-1;) – 2010-04-23 05:57:32

+0

我同意,但有时候希望某种方式出于某种原因,我们不知道。尽管以某种特定的方式制作某种东西并不是一种最佳做法,但人们可以*地做任何他想做的事情,以实现自己的目标。所以,我给出了他想要做的解决方案,建议他不推荐这种做法。无论如何感谢不要低估我的答案。 – 2010-04-27 14:08:17

IF v_Exists = 1 THEN 
    EXECUTE IMMEDIATE "DROP TABLE TEMP_TRAN"; 
ENDIF 

这个程序唯一的问题是,当你正在寻找的表不存在 那就麻烦一开始的没有数据发现错误,你会甚至没有进入该行 用于检查v存在价值。 :)