ORACLE: können wir globale temporäre Tabellen oder alle Tabellen in gespeicherte Prozedur erstellen?

StackOverflow https://stackoverflow.com/questions/2692140

  •  01-10-2019
  •  | 
  •  

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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top