ORACLE: possiamo creare tabelle temporanee globali o tutte le tabelle di stored procedure?
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.
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.