2015-08-24 1 views
1

Je suis novice dans les scripts Oracle et j'ai des problèmes avec l'insertion de données dans une table temporaire globale. Voici le script que j'ai créé dans Toad:INSERT ne fonctionne pas sur GLOBAL TEMPORARY TABLE dans un bloc PL/SQL

SET SERVEROUTPUT ON; 

    DECLARE 
     tempTwwIDExist NUMBER; 
     v_sql LONG; 
    BEGIN 
     SELECT COUNT(*) INTO tempTwwIDExist FROM USER_TABLES WHERE table_name = UPPER('tempTwwID'); 
     DBMS_OUTPUT.PUT_LINE(tempTwwIDExist); 

     IF (tempTwwIDExist > 0) THEN 
     BEGIN 
       EXECUTE IMMEDIATE 'TRUNCATE TABLE tempTwwID'; 
       EXECUTE IMMEDIATE 'DROP TABLE tempTwwID'; 
     END; 
     END IF; 

     EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE tempTwwID (id NUMBER NOT NULL, SITEID NUMBER) ON COMMIT DELETE ROWS'; 

     EXECUTE IMMEDIATE 'INSERT INTO tempTwwID (id, SITEID) VALUES (1,123)'; 

    END; 
    /

Cependant, quand je lance une instruction SELECT pour obtenir toutes les données de tempTwwID, maintenant lignes sont renvoyées en dépit de l'instruction INSERT ce script est exécuté en utilisant EXECUTE IMMEDIATE (dernière ligne de code avant FIN;).

J'espère que vous pouvez m'aider avec ceci. Merci d'avance.

+0

Voulez-vous imprimer les lignes de la table tempTwwID? – Buddi

+1

Comment lancez-vous votre script? Exécutez-vous le script et interrogez-vous la table dans la même session? – pablomatico

+2

Ne pas tronquer, supprimer ou créer des GTT dans le code de l'application. –

Répondre

3

Vous avez défini la table temporaire globale avec ON COMMIT DELETE ROWS. Si vous validez explicitement à l'intérieur de votre bloc anonyme - avec ou sans cela à travers execute immediate, ce qui est inutile - ou après le bloc, alors les requêtes suivantes dans cette session ne verront plus les données insérées. Ce qui pourrait être moins évident est que Toad can be configured to auto-commit. Si cela est défini, les changements dans votre bloc seront automatiquement validés dès qu'ils seront exécutés, ce qui signifie que la ligne insérée dans le bloc sera effacée avant que vous puissiez l'interroger. Si vous modifiez le GTT en ON COMMIT PRESERVE ROWS, vous verrez les données lorsque vous interrogez.

Ceci n'est pas limité au crapaud; vous pouvez voir la même chose dans SQL Developer ou SQL * Plus avec set autocommit on. Si vous n'avez pas de bonne raison de vous engager automatiquement, vous pouvez simplement l'éteindre. Comme Jeffrey Kemp a dit que vous ne devriez pas créer votre GTT (ou apporter des modifications à un schéma) au moment de l'exécution, comme le dit Jeffrey Kemp; le schéma devrait être contrôlé et statique. Les GTT d'Oracle ne sont pas les mêmes que les tables temporaires locales que vous définissez à la volée dans d'autres bases de données et doivent être créées une seule fois. It is the data that is temporary, not the table object. La définition de choses à l'exécution implique des validations implicites auxquelles vous ne vous attendez pas (puisque DDL commits), est coûteuse, risque des conflits entre les sessions et vous oblige à utiliser le SQL dynamique là où il ne devrait pas être nécessaire; ce qui à son tour empêche que le code soit vérifié au moment de la compilation, ce qui signifie que les erreurs de syntaxe ne seront pas visibles avant l'exécution.

+0

Salut @Alex Poole! Suivi tous vos conseils et j'ai tout fait fonctionner. Il se comporte comme la table temporaire dans T-SQL mais n'a pas besoin d'être déclaré chaque fois que vous exécutez votre script. Merci beaucoup. –