0

下面是我写的存储过程:

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 创建这个存储过程。

任何帮助将不胜感激。

4

3 回答 3

8

全局临时表并不意味着由存储过程“动态”创建。它们将像任何其他表一样永久创建一次。它是临时的数据,而不是表对象。

关于 TEMP_TRAN,可能存在该名称的对象,但不是?试试这个:

select * from all_objects where object_name = 'TEMP_TRAN';
于 2010-04-22T15:39:56.423 回答
1
IF v_Exists = 1 THEN
    EXECUTE IMMEDIATE "DROP TABLE TEMP_TRAN";
ENDIF

此过程的唯一问题是,当您要查找的表不存在时,麻烦就从没有找到数据错误开始,您甚至不会进入检查 v 存在值的那一行。:)

于 2011-11-30T18:47:21.463 回答
0

你试过这个查询吗?

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 年没有与 Oracle 合作了。但是,如果您按照自己的方式解决它,您可能会实现您想要做的事情。

但是,我确实同意临时表并不是要按程序删除,而是要像常规表一样存在。

于 2010-04-22T15:40:57.930 回答