IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

GTT et PS (Globale Temporary Table et Stored Procedure))


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 34
    Points : 23
    Points
    23
    Par défaut GTT et PS (Globale Temporary Table et Stored Procedure))
    Bonjour,

    J'ai créé une GTT avec l'option "On Commit preserve rows".
    Je remplis cette GTT par une SP et cette GTT remplit sa fonction en gardant en mémoire les data le temps de la SP.

    Mais une fois sortie de la SP, cette GTT est vide, malgré le fait que ma session n'est pas achevée et malgré l'option "On Commit preserve rows".

    Peut-on garder cette GTT avec ses lignes une fois sortie de la SP ?
    (Sinon je crée une table normale...)

  2. #2
    Membre éclairé Avatar de jkofr
    Homme Profil pro
    Senior Consultant DBA (Trivadis SA)
    Inscrit en
    Octobre 2006
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Suisse

    Informations professionnelles :
    Activité : Senior Consultant DBA (Trivadis SA)
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 484
    Points : 724
    Points
    724
    Par défaut
    Hello

    Comment execute-tu ta SP? Avec quel client?

    Currieux quand même:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
     
    CREATE GLOBAL TEMPORARY TABLE tst 
    (
     OWNER                                              VARCHAR2(30),
     OBJECT_NAME                                        VARCHAR2(128),
     SUBOBJECT_NAME                                     VARCHAR2(30),
     OBJECT_ID                                          NUMBER,
     DATA_OBJECT_ID                                     NUMBER,
     OBJECT_TYPE                                        VARCHAR2(19),
     CREATED                                            DATE,
     LAST_DDL_TIME                                      DATE,
     TIMESTAMP                                          VARCHAR2(19),
     STATUS                                             VARCHAR2(7),
     TEMPORARY                                          VARCHAR2(1),
     GENERATED                                          VARCHAR2(1),
     SECONDARY                                          VARCHAR2(1),
     NAMESPACE                                          NUMBER,
     EDITION_NAME                                       VARCHAR2(30)
    ) ON COMMIT PRESERVE ROWS;
     
    create or replace procedure testload as
    begin
     
    insert into tst select * from dba_objects;
    commit;
    end;
    /
     
     
    Select count (*) from tst;
     
    SQL> select count (*) from tst;
     
      COUNT(*)
    ----------
             0
     
    SQL> exec testload;
     
    PL/SQL procedure successfully completed.
     
    SQL> select count (*) from tst;
     
     
      COUNT(*)
    ----------
         75214

    Jko
    OCM 11g, RAC and Performance & Tuning Expert 11g
    RMAN Backup & Recovery, Data Guard and Grid Control

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 34
    Points : 23
    Points
    23
    Par défaut
    Je travaille sous SQL Developer.
    J'ai créer ma GTT ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CREATE GLOBAL TEMPORARY TABLE "xxxx"."PG_TEMP_TOTO" 
       (	"ID_ST" NUMBER(3,0)
       ) ON COMMIT PRESERVE ROWS ;
    Voici ma SP
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE OR REPLACE PROCEDURE PG_PS_TOTO AS 
    BEGIN
      execute immediate 'truncate table "LTEC"."PG_TEMP_TOTO"';
      insert into "LTEC"."PG_TEMP_TOTO"  VALUES (13);
      COMMIT;
    END PG_PS_TOTO;
    J'ai l'impression que deux GTT existent sous le même nom, hors et dans la SP !

  4. #4
    Membre expert

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2012
    Messages
    612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2012
    Messages : 612
    Points : 3 066
    Points
    3 066
    Par défaut
    Bonjour,

    Pourquoi ce ""xxxx"."PG_TEMP_TOTO"" ? Les "xxxx" correspondent bien à "LTEC" ?

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 34
    Points : 23
    Points
    23
    Par défaut
    oui

  6. #6
    Membre éclairé Avatar de jkofr
    Homme Profil pro
    Senior Consultant DBA (Trivadis SA)
    Inscrit en
    Octobre 2006
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Suisse

    Informations professionnelles :
    Activité : Senior Consultant DBA (Trivadis SA)
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 484
    Points : 724
    Points
    724
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    SQL> CREATE GLOBAL TEMPORARY TABLE PG_TEMP_TOTO
       (    ID_ST NUMBER(3,0)
       ) ON COMMIT PRESERVE ROWS ;
      2    3  
    Table created.
     
    SQL> CREATE OR REPLACE PROCEDURE PG_PS_TOTO AS 
    BEGIN
      execute immediate 'truncate table PG_TEMP_TOTO';
      INSERT INTO PG_TEMP_TOTO VALUES (13);
      COMMIT;
    END PG_PS_TOTO;
    /
      2    3    4    5    6    7  
    Procedure created.
     
    SQL> exec PG_PS_TOTO;
     
    PL/SQL procedure successfully completed.
     
    SQL> select count (*) from PG_TEMP_TOTO;
     
      COUNT(*)
    ----------
             1
     
    SQL>
    Cela fonctionne en 11.2.0.3 x64 sous linux.

    Vous êtes en quelle version?

    jko
    OCM 11g, RAC and Performance & Tuning Expert 11g
    RMAN Backup & Recovery, Data Guard and Grid Control

  7. #7
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 34
    Points : 23
    Points
    23
    Par défaut
    SQL Developer est en version 4.0.0.13 et Oracle en 11.

    Je résume (un peu vite car je n'ai pas les connaissances pour vérifier ce que je dis) : sous SQL Developer j'ai deux tables temporaires qui ont le même nom l'un est directement visible et l'autre n'existe que sous SP.
    Si je remplis la GTT sous une requête normale j'ai un contenu. Sous SP : un autre !
    D'un autre côté je n'ai créé la table qu'une fois et elle est globale.

  8. #8
    Membre éclairé Avatar de jkofr
    Homme Profil pro
    Senior Consultant DBA (Trivadis SA)
    Inscrit en
    Octobre 2006
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Suisse

    Informations professionnelles :
    Activité : Senior Consultant DBA (Trivadis SA)
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 484
    Points : 724
    Points
    724
    Par défaut
    La SP est sous quel utilisateur?

    Un autre ou LTEC?

    Ps: il est impossible d'avoir deux tables avec le même nom.

    Jko
    OCM 11g, RAC and Performance & Tuning Expert 11g
    RMAN Backup & Recovery, Data Guard and Grid Control

  9. #9
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 34
    Points : 23
    Points
    23
    Par défaut
    LTEC.

    J'ai l'impression que SQL Developer crée plusieurs sessions. D'ailleurs chaque SP m'indique (par exemple) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Connexion à la base de données ltec.
    Hello!
    Bye!
    Processus fermé.
    Déconnexion de la base de données ltec.


    Que ce passerait-il si deux utilisateurs sous le noms de LTEC travaille en même temps sur une GTT ?

    SQL Developer peut-il créer plusieurs sessions ?

    (J'ouvre un autre thread, car j'ai l'impression que les Materialized views sont une solution de contournement pour ce que je dois faire.)

  10. #10
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 821
    Points : 6 443
    Points
    6 443
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Il faudrait donner des infos plus précises.
    Une procédure stockée ne peut pas se connecter ou se deconnecter. Elle ne peut s'exécuter que dans une session déjà établie.
    Cordialement,
    Franck.
    Franck Pachot - Developer Advocate Yugabyte 🚀 Base de Données distribuée, open source, compatible PostgreSQL
    🗣 twitter: @FranckPachot - 📝 blog: blog.pachot.net - 🎧 podcast en français : https://anchor.fm/franckpachot

  11. #11
    Membre éclairé Avatar de jkofr
    Homme Profil pro
    Senior Consultant DBA (Trivadis SA)
    Inscrit en
    Octobre 2006
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Suisse

    Informations professionnelles :
    Activité : Senior Consultant DBA (Trivadis SA)
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 484
    Points : 724
    Points
    724
    Par défaut
    Vouis,
    Tout cela me semble confus!
    Jko
    OCM 11g, RAC and Performance & Tuning Expert 11g
    RMAN Backup & Recovery, Data Guard and Grid Control

  12. #12
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 34
    Points : 23
    Points
    23
    Par défaut
    Je veux bien être plus précis.

    1. Si je lance mes requêtes SQL ma GTT répond normalement ;
    2. Idem si je lance ma SP.


    Mais les contenus des GTT peuvent diffèrer. Pour arriver à cela :
    1. Sous SQL créer la GTT, puis la remplir
    2. Sous SP la vider, puis la remplir différement.
    3. Revenir sous SQL : on a toujours le contenu de l'étape n°1 et non celui de l'étape 2.


    Avez-vous SQL Developer ?

  13. #13
    Membre éclairé Avatar de jkofr
    Homme Profil pro
    Senior Consultant DBA (Trivadis SA)
    Inscrit en
    Octobre 2006
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Suisse

    Informations professionnelles :
    Activité : Senior Consultant DBA (Trivadis SA)
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 484
    Points : 724
    Points
    724
    Par défaut
    Hello, voici ce que je comprends:

    Session 1: avec sqldevelopeur créer la GTT, puis la remplir
    Session 2: avec SP la vider, puis la remplir différemment.
    Retour Session 1:on a toujours le contenu de l'étape n°1 et non celui de l'étape 2.

    Et bien c'est normal!
    Oui j'ai SQLDeveloper 4
    Je suis curieux d'avoir la démarche step by step...
    Merci

    jko
    OCM 11g, RAC and Performance & Tuning Expert 11g
    RMAN Backup & Recovery, Data Guard and Grid Control

  14. #14
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 34
    Points : 23
    Points
    23
    Par défaut
    "Normal" : Aïe ! j'aurais dû m'en douter.

    "Step by step" : pas sûr que je puisse aider. En quoi cela consiste-t-il ?

  15. #15
    Membre éclairé Avatar de jkofr
    Homme Profil pro
    Senior Consultant DBA (Trivadis SA)
    Inscrit en
    Octobre 2006
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Suisse

    Informations professionnelles :
    Activité : Senior Consultant DBA (Trivadis SA)
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 484
    Points : 724
    Points
    724
    Par défaut
    Heu

    Etape par etape...

    Jko
    OCM 11g, RAC and Performance & Tuning Expert 11g
    RMAN Backup & Recovery, Data Guard and Grid Control

  16. #16
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 34
    Points : 23
    Points
    23
    Par défaut
    Hum ! Ce doit être ça.
    Peut-on voir ça sous SQL Developer ?

  17. #17
    Membre éclairé Avatar de jkofr
    Homme Profil pro
    Senior Consultant DBA (Trivadis SA)
    Inscrit en
    Octobre 2006
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Suisse

    Informations professionnelles :
    Activité : Senior Consultant DBA (Trivadis SA)
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 484
    Points : 724
    Points
    724
    Par défaut
    Je t'écoute...
    jko
    OCM 11g, RAC and Performance & Tuning Expert 11g
    RMAN Backup & Recovery, Data Guard and Grid Control

  18. #18
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 34
    Points : 23
    Points
    23
    Par défaut
    Pardon ! Je voulais dire : "comment voit-on cela sous SqlDeveloper ?"

  19. #19
    Membre éclairé Avatar de jkofr
    Homme Profil pro
    Senior Consultant DBA (Trivadis SA)
    Inscrit en
    Octobre 2006
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Suisse

    Informations professionnelles :
    Activité : Senior Consultant DBA (Trivadis SA)
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 484
    Points : 724
    Points
    724
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
     
    -- Suppression de la table
    drop table sh.PG_TEMP_TOTO;
     
    -- Création de la table
    CREATE GLOBAL TEMPORARY TABLE sh.PG_TEMP_TOTO
       (    ID_ST NUMBER(3,0)
       ) ON COMMIT PRESERVE ROWS ;
     
     
    -- Création de la SP
    CREATE OR REPLACE PROCEDURE SH.PG_PS_TOTO AS 
    lval  number;
    BEGIN
      select id_st into lval from sh.PG_TEMP_TOTO;
      dbms_output.put_line ('1-Valeur=:'||lVal);
      execute immediate 'truncate table SH.PG_TEMP_TOTO';
      INSERT INTO SH.PG_TEMP_TOTO VALUES (13);
      COMMIT;
      select id_st into lval from sh.PG_TEMP_TOTO;
      dbms_output.put_line ('2-Valeur=:'||lVal);
    END PG_PS_TOTO;
    /
     
    -- Insertion ligne en SQL
    INSERT INTO SH.PG_TEMP_TOTO VALUES (14);
    1 rows inserted.
     
    -- Controle ligne en SQL
    select * from SH.PG_TEMP_TOTO;
         ID_ST
    ----------
            14 
     
    -- Exécution SP
    set serveroutput on
    exec SH.PG_PS_TOTO;
    anonymous block completed
    1-Valeur=:14		<-- Valeur insérée en SQL avant troncate dans SP
    2-Valeur=:13		<-- Valeur après insert dans SP
     
    -- Controle ligne  après SP en SQL
    select * from SH.PG_TEMP_TOTO;
         ID_ST
    ----------
            13
    Pas de problèmes...

    Par contre avant de relancer tout le script il faut faire au niveau SQL
    truncate table SH.PG_TEMP_TOTO;

    Sinon erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SQL Error: ORA-14452: tentative de création, modification ou suppression d'un index sur une table temporaire déjà en cours d'utilisation
    14452. 00000 -  "attempt to create, alter or drop an index on temporary table already in use"
    *Cause:    An attempt was made to create, alter or drop an index on temporary
               table which is already in use.
    *Action:   All the sessions using the session-specific temporary table have
               to truncate table and all the transactions using transaction
               specific temporary table have to end their transactions.
    Ce qui est curieux car nous sommes dans la même session...
    Je crois que le problème est le truncate dans la SP.

    Indépendamment, je n'ai pas le comportement que vous décrivez...

    jko
    OCM 11g, RAC and Performance & Tuning Expert 11g
    RMAN Backup & Recovery, Data Guard and Grid Control

  20. #20
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 34
    Points : 23
    Points
    23
    Par défaut
    Merci pour cet essai.

    Mais que cela soit chez moi ou chez vous il y a un problème que je juge gênant pour le produit final que j'envisageais.

    D'un côté je ne lance pas la SP de la même façon que vous, car je crée (involontairement) une nouvelle session.
    D'un autre, le truncate qui n'est pas accepté n'est pas meilleur (je pense qu'il faut que cela soit le même user, même session ou etc. qui fasse le remplissage et le truncate.

    Je vais clore ce thread.
    A bientôt.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/08/2014, 14h32
  2. Utilisation de global temporary tables
    Par LEK dans le forum SQL
    Réponses: 21
    Dernier message: 17/09/2012, 15h53
  3. global temporary table en cache ?
    Par 13thFloor dans le forum Administration
    Réponses: 3
    Dernier message: 04/03/2008, 19h34
  4. Global Temporary Table
    Par pdiaz dans le forum Administration
    Réponses: 2
    Dernier message: 21/03/2007, 12h08
  5. Drop of global temporary table
    Par dev_ora_moimeme dans le forum Oracle
    Réponses: 8
    Dernier message: 07/07/2006, 17h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo