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

PL/SQL Oracle Discussion :

Créer et lire une vue dans un traitement PL/SQL


Sujet :

PL/SQL Oracle

  1. #1
    Candidat au Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Août 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2017
    Messages : 3
    Par défaut Créer et lire une vue dans un traitement PL/SQL
    Bonjour,
    je suis débutante en sql.
    Je dois modifier une requête existante qui est écrite comme ceci :

    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
    DECLARE 
    A VARCHAR2(20):='test'; 
    B  INTEGER;
    C INTEGER:=20; 
     
    BEGIN
    INSERT INTO table1
    (    c1 ,
        c2 ,
        c3 ,
    SELECT  T2.a1, T2.a2, T2,a3
      FROM table 2 T2 
      WHERE   condition );
     
    INSERT INTO table1
    (    c1 ,
        c2 ,
        c3 ,
    SELECT  T3.a1, T3.a2, T3,a3
      FROM table 3 T3 
      WHERE   condition );
     
    etc....
    END;
    COMMIT;

    Mon problème est que je souhaiterais faire une vue ou une table temporaire qui serait le résultat d'une sélection et faire dans l'un de mes "select", une jointure sur cette vue.
    Seulement lorsque je fais un With toto as ******;

    je ne sais pas ou le mettre ? je dois le mettre a quel endroit du traitement, je cherche depuis 2 jours sans succès.
    si je fais un with dans une requête normale ça fonctionne mais pas un bloc pl/sql.
    Merci de votre aide

  2. #2
    Membre Expert
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 005
    Par défaut
    Ici il y a des exemples qui devraient te convenir : https://stackoverflow.com/questions/...th-with-clause

    Un exemple (que je n'ai pas validé mais juste recopié du site ci-dessus) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    INSERT
    INTO    dummy1
    WITH    helper_table AS
            (
            SELECT  *
            FROM    dummy2
            )
    SELECT  t.a
    FROM    helper_table t
    WHERE   t.a = 'X'

  3. #3
    Candidat au Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Août 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2017
    Messages : 3
    Par défaut ça fonctionne mais ....
    Bonjour,

    Merci pour ta réponse, j'avoue qu'au départ, je ne l'avais pas comprise et puis j'ai testé ceci, en fonction de ton exemple : et ça fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    insert into table 1 
    (c1,
    c2,
    c3) 
    with VUE1 as 
    (select a1, a2, a3 from table 2 Inner join Table 3 inner join table 4 ...where .....)
    select a1 from Vue1 where ......
    END;
    Commit;
    Mais je me rends compte que ce with, ne sera valable que pour ce bout dans ma requête générale, et que je ne pourrais pas être réutilisé dans un autre Insert ....
    je pense qu'au final une table temporaire pourrait mieux répondre à mon besoin, mais idem, ou la déclarer ? à part ? dans le déclare sachant que j'ai une variable alimentée en amont qui servira de filtre dans ma table temporaire ...

    J'ai un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    DECLARE 
    variable toto ='12345'
    BEGIN
    insert ******
    END;
    COMMIT;
    je ne sais pas ou je dois créer la table temporaire (dans ou pas une procédure avec execute immediate ?) sachant que dans la sélection qui va l'alimenter je souhaite faire un where c5=toto
    Je ne trouve pas d'emple répondant à mon prb..

    Merci

  4. #4
    Membre Expert
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 005
    Par défaut
    Voici à nouveau quelques liens qui devraient t'aider.

    Ici il est bien mentionné qu'on peut déclarer des tables temporaires globales en PL/SQL https://oracle-base.com/articles/misc/temporary-tables : "Applications often use some form of temporary data store for processes that are to complicated to complete in a single pass. Often, these temporary stores are defined as database tables or PL/SQL tables"

    Des exemples ici https://stackoverflow.com/questions/...emporary-table
    Ce code me semble correspondre à ce que tu recherches puisque la table temporaire est définie avant l'INSERT.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    DECLARE
      l_column1 number;
    begin
      begin
        execute immediate 'create global temporary table my_temp_table(column1 number) 
    on commit   preserve rows';
      exception when others
        then
        dbms_output.put_line(sqlerrm);
      end;
      insert into my_temp_table (column1) values (1);
      select * into l_column1 from my_temp_table where column1=1;
      dbms_output.put_line('the temp value is '||l_column1);   
    end;

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Citation Envoyé par DEV_92500 Voir le message
    Mais je me rends compte que ce with, ne sera valable que pour ce bout dans ma requête générale, et que je ne pourrais pas être réutilisé dans un autre Insert ....
    Dans ce cas vous pouvez créer une vue pour réutiliser le code SQL d'une requête à différents endroits de votre code PL/SQL.
    Citation Envoyé par DEV_92500 Voir le message
    je pense qu'au final une table temporaire pourrait mieux répondre à mon besoin, mais idem, ou la déclarer ? à part ? dans le déclare sachant que j'ai une variable alimentée en amont qui servira de filtre dans ma table temporaire ...
    Sur Oracle, contrairement à d'autres SGBD, la structure d'une table temporaire est créée une fois pour toute, ce sont les données qu'elle contient qui sont temporaires et rattachées exclusivement à la session en cours.

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Vous pouvez créer une table de travail classique ou une table temporaire.
    Pour faire simple, cette dernière se vide des données de votre session lorsque vous vous déconnectez et peut être utilisée par plusieurs personnes en même temps.

    Si votre traitement tourne seul (ex : alimentation d'une table agrégée type datamart), restez sur une table simple, compressez-là si vous le pouvez et indiquez un PCTFREE à 0 lors de la création.
    Commencez votre traitement par un execute immediate 'truncate table matable';, puis alimentez celle-ci à l'aide d'un insert /*+ append */ select...;, exécutez un commit puis passer un petit coup de statistique dessus.

    Si votre traitement peut tourner sur plusieurs sessions en parallèle, utilisez une table temporaire et faite un insert simple.

    Créez votre table maintenant et utilisez-là dans votre PL/SQL.

  7. #7
    Candidat au Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Août 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2017
    Messages : 3
    Par défaut Merci à tous pour votre aide
    Un grand merci pour l'attention portée à mon problème.

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

Discussions similaires

  1. Créer une vue dans une base vers une autre base ?
    Par guidav dans le forum Requêtes
    Réponses: 1
    Dernier message: 11/02/2008, 15h43
  2. [9iR2][PL/SQL] Comment créer une vue dans un package ?
    Par mainecoon dans le forum Oracle
    Réponses: 6
    Dernier message: 22/02/2006, 08h10
  3. Oracle Designer: récupération d'une vue dans la base
    Par BILLYPATOU dans le forum Designer
    Réponses: 2
    Dernier message: 19/03/2004, 11h08
  4. [DEBUTANT] Une vue dans une procedure stockee ?
    Par Invité dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 25/02/2004, 11h57
  5. Lire une valeur dans le registre
    Par John.s dans le forum C
    Réponses: 2
    Dernier message: 26/11/2003, 19h55

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