ORACLE: können wir globale temporäre Tabellen oder alle Tabellen in gespeicherte Prozedur erstellen?
Frage
unten ist die gespeicherte Prozedur Ich schrieb:
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;
, wenn ich es ausgeführt, ich eine Fehlermeldung zu erwähnen:
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.
Ich habe versucht, die TEMP_TRAN fallen zu lassen, und es sagt Tabelle existiert nicht. So gibt es keine TEMP_TRAN Tabelle im System vorhanden ist. Warum erhalte ich diesen Fehler? Ich bin mit TOAD dieser gespeicherte Prozedur zu erstellen.
Jede mögliche Hilfe würde sehr geschätzt werden.
Lösung
Globale temporäre Tabellen werden nicht durch gespeicherte Prozeduren erstellt werden „on the fly“ zu verstehen. Sie sind auf einmal erstellt werden, fest, wie jede andere Tabelle. Es sind die Daten, die nur vorübergehend ist, nicht das Tabellenobjekt.
In Bezug auf TEMP_TRAN, vielleicht ein Objekt dieser Name existiert, ist aber nicht ein Tabelle ? Versuchen Sie folgendes:
select * from all_objects where object_name = 'TEMP_TRAN';
Andere Tipps
IF v_Exists = 1 THEN
EXECUTE IMMEDIATE "DROP TABLE TEMP_TRAN";
ENDIF
das einzige Problem bei diesem Verfahren besteht darin, dass, wenn die Tabelle die Sie suchen, existiert nicht dann begannen Probleme mit keinen Daten gefunden Fehler, und Sie werden nicht einmal in diese Zeile erhalten dass der Check für v existiert Wert. :)
Haben Sie diese Abfrage versucht?
select * from all_tables where table_name like '%TEMP_TRAN%'
Wenn ja, ist die Tabelle aufgelistet?
Ein weiterer Weg zu gehen, ist die Verwendung der EXECUTE IMMEDIATE-Anweisung.
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;
Bitte meine rostigen Oracle Fähigkeiten berücksichtigen. Ich habe jetzt nicht mit Oracle für ca. 2 Jahre gearbeitet. Aber wenn man um ihn herum arbeiten Sie, könnten Sie erreichen, was Sie versuchen zu tun.
Allerdings habe ich damit einverstanden, dass eine temporäre Tabelle nicht procedurely fallen gelassen werden soll, sondern eher wie eine normale Tabelle existieren.