下面是我写的存储过程:
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 :(得分:7)
全局临时表不是由存储过程“即时”创建的。它们将像任何其他表一样永久地创建一次。它是临时的数据,而不是表对象。
关于TEMP_TRAN,可能存在该名称的对象,但不是表?试试这个:
select * from all_objects where object_name = 'TEMP_TRAN';
答案 1 :(得分:1)
IF v_Exists = 1 THEN
EXECUTE IMMEDIATE "DROP TABLE TEMP_TRAN";
ENDIF
此过程的唯一问题是当您要查找的表不存在时 然后麻烦开始没有找到数据错误,你甚至不会进入那条线 检查v是否存在值。 :)
答案 2 :(得分: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技能。我已经有两年没用Oracle了。但如果你按照自己的方式工作,你可能会实现你想要做的事情。
但是,我确实同意临时表不是故意删除,而是像普通表一样存在。