ORACLE: pouvons-nous créer des tables temporaires globales ou des tables dans le proc stocké?

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

  •  01-10-2019
  •  | 
  •  

Question

ci-dessous est la procédure stockée je l'ai écrit:

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 table n'existe pas. Donc, il n'y a pas de table de TEMP_TRAN existait dans le système. pourquoi je reçois cette erreur? J'utilise TOAD pour créer cette procédure stockée.

Toute aide serait très appréciée.

Était-ce utile?

La solution

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

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

select * from all_objects where object_name = 'TEMP_TRAN';

Autres conseils

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 trouvé erreur et vous ne même pas entrer dans cette ligne que l'enregistrement pour v existe valeur. :)

Avez-vous essayé cette recherche?

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

Si oui, est la table dans la liste?

Une autre façon de faire est à l'aide 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;

S'il vous plaît considérer mes rouillées compétences Oracle. Je n'ai pas travaillé avec Oracle pendant environ 2 ans. Mais si vous travaillez votre chemin, vous pouvez réaliser ce que vous essayez de faire.

Cependant, je suis d'accord qu'une table temporaire ne vise pas à être abandonné procedurely, mais plutôt d'exister comme une table ordinaire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top