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创建这个存储过程。
任何帮助将不胜感激。
全局临时表并不是要通过存储过程“实时”创建的。它们将永久性地创建一次,就像任何其他表一样。它是临时的数据,而不是表格对象。
关于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年。但是,如果你按照自己的方式工作,你可能会达到你想要做的。
但是,我确实同意临时表并不意味着要被过程删除,而是像普通表一样存在。
不需要“解决”问题 - 正如您所说,临时表不应该被程序创建或删除。 (你几乎从我身上得到-1;) – 2010-04-23 05:57:32
我同意,但有时候希望某种方式出于某种原因,我们不知道。尽管以某种特定的方式制作某种东西并不是一种最佳做法,但人们可以*地做任何他想做的事情,以实现自己的目标。所以,我给出了他想要做的解决方案,建议他不推荐这种做法。无论如何感谢不要低估我的答案。 – 2010-04-27 14:08:17
IF v_Exists = 1 THEN
EXECUTE IMMEDIATE "DROP TABLE TEMP_TRAN";
ENDIF
这个程序唯一的问题是,当你正在寻找的表不存在 那就麻烦一开始的没有数据发现错误,你会甚至没有进入该行 用于检查v存在价值。 :)
该脚本不会创建有效的存储过程,因此您无法执行它。您可以执行脚本,但它会失败以创建可以运行的有效过程。 – 2010-04-22 15:52:13