2010-04-22 3 views
0

ci-dessous est le proc stocké je l'ai écrit:ORACLE: pouvons-nous créer des tables temporaires globales ou des tables dans proc stocké?

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; 

quand je l'exécutaient, je reçois un message d'erreur mentionnant:

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. 

J'ai essayé de laisser tomber le TEMP_TRAN et il dit la table n'existe pas . Il n'y a donc pas de table TEMP_TRAN dans le système. pourquoi ai-je cette erreur? J'utilise TOAD pour créer ce proc stocké.

Toute aide serait grandement appréciée.

+0

Ce script ne crée pas une procédure stockée valide, vous ne pouvez donc pas l'exécuter. Vous pouvez exécuter le script, mais il échouera à créer une procédure valide que vous pouvez exécuter. –

Répondre

7

Les tables temporaires globales ne sont pas conçues pour être créées «à la volée» par des procédures stockées. Ils doivent être créés une fois, de façon permanente, comme n'importe quelle autre table. Ce sont les données temporaires et non l'objet table.

En ce qui concerne TEMP_TRAN, peut-être un objet de ce nom existe, mais n'est pas une table ? Essayez ceci:

select * from all_objects where object_name = 'TEMP_TRAN'; 
0

Avez-vous essayé cette requête?

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

Si oui, le tableau est-il listé?

Une autre solution consiste à utiliser l'instruction 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; 

Veuillez prendre en compte mes compétences Oracle rouillées. Je n'ai pas travaillé avec Oracle depuis environ 2 ans maintenant. Mais si vous travaillez autour de vous, vous pourriez réaliser ce que vous essayez de faire.

Cependant, je suis d'accord qu'une table temporaire n'est pas destinée à être abandonnée de façon procédurale, mais plutôt à exister juste comme une table normale.

+0

Pas besoin de "contourner" le problème - comme vous le dites, les tables temporaires ne doivent JAMAIS être créées ou abandonnées de manière procédurale. (vous avez presque obtenu un -1 de moi;) –

+0

Je suis d'accord, mais parfois on veut faire quelque chose d'une certaine façon pour des raisons que nous ne connaissons pas. Même si ce n'est pas une bonne pratique ou si faire quelque chose d'une manière particulière, on est libre de faire ce qu'il veut pour réaliser ce qu'il veut. Donc, je donne la solution pour ce qu'il veut faire, en l'informant que ce n'est pas une pratique recommandée. Merci quand même de ne pas avoir downvoté ma réponse. –

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

le seul problème avec cette procédure est que lorsque la table que vous recherchez n'existe pas alors du mal a commencé avec aucune donnée erreur trouvée et vous ne serez pas même entrer dans cette ligne qui vérifient v existe la valeur. :)

Questions connexes