以下是我写的存储的Proc:

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表。为什么我会遇到这个错误?我正在使用蟾蜍来创建此存储的Proc。

任何帮助将不胜感激。

有帮助吗?

解决方案

整体临时表不打算通过存储过程“飞行”创建。它们将像其他任何桌子一样永久创建一次。是暂时的数据,而不是表对象。

关于temp_tran,也许 目的 该名称的存在,但不是 桌子?试试这个:

select * from all_objects where object_name = 'TEMP_TRAN';

其他提示

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

此过程的唯一问题是,当您要寻找的表不存在的表格时,麻烦就开始出现未找到的数据错误,您甚至不会进入该线路检查V V value的该行。 :)

您是否尝试过此查询?

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

如果是这样,是否列出了表格?

另一种方法是使用执行立即语句。

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;

请考虑我生锈的甲骨文技能。我已经有大约2年没有与Oracle合作。但是,如果您围绕它而努力,则可能实现自己想做的事情。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top