ORACLE: possiamo creare tabelle temporanee globali o tutte le tabelle di stored procedure?

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

  •  01-10-2019
  •  | 
  •  

Domanda

seguito riportate le stored procedure che ho scritto:

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;

quando ho eseguito, ottengo un messaggio di errore di nota:

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.

Ho cercato di far cadere il TEMP_TRAN e dice tabella non esiste. Quindi non c'è un tavolo TEMP_TRAN esistito in sistema. perché sto ottenendo questo errore? Sto usando ROSPO per creare questa stored procedure.

Qualsiasi aiuto sarebbe molto apprezzato.

È stato utile?

Soluzione

tabelle temporanee globali non sono destinate ad essere creato "al volo" di stored procedure. Essi devono essere creati una sola volta, in modo permanente, come qualsiasi altra tabella. Sono i dati che è temporaneo, non l'oggetto della tabella.

Per quanto riguarda TEMP_TRAN, forse un oggetto di esiste quel nome, ma non è un tabella ? Prova questo:

select * from all_objects where object_name = 'TEMP_TRAN';

Altri suggerimenti

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

l'unico problema con questa procedura è che quando la tabella che si sta cercando non esiste poi problemi sono iniziati con un Nessun dato trovato l'errore e non sarà nemmeno entrare in quella linea tale controllo per v esiste valore. :)

Hai provato questa ricerca?

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

Se è così, è la tabella elencata?

Un altro modo per andare è utilizzando l'istruzione 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;

Si prega di considerare le mie abilità arrugginite Oracle. Non ho lavorato con Oracle per circa 2 anni. Ma se si lavora il vostro senso intorno ad esso, si potrebbe ottenere ciò che stai cercando di fare.

Tuttavia, sono d'accordo che una tabella temporanea non è destinata ad essere caduto procedurely, ma piuttosto di esistere, proprio come una tabella normale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top