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 :

BLOC avec CLAUSE WITH [11gR2]


Sujet :

PL/SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Mars 2002
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 68
    Points : 49
    Points
    49
    Par défaut BLOC avec CLAUSE WITH
    Hello ,

    J'ai de nouveau un soucis, j'aimerai pouvoir creer un bloc PL SQL avec :

    une clause WITH declaré dans le bloc DECLARE
    une commande SELECT INTO dans le code BEGIN avec une jointure entre la clause WITH et une autre table. ( 4 table au total )

    et par la suite j'aimerai pouvoir utiliser les donnée et les enregistrer avec UTL_FILE.

    pour le moment je n'arrive pas a utiliser la clause WITH

    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    DECLARE
     
    var_datedebut VARCHAR2(20);
    var_duree VARCHAR2(10);
    var_uniqueid VARCHAR2(50);
    var_service VARCHAR2(100);
    var_interface VARCHAR2(100);
    var_type_error VARCHAR2(5);
    var_sens VARCHAR2(15);
    var_team VARCHAR2(20);
    var_categorie VARCHAR2(50);
    var_errormessage VARCHAR2(1000);
    var_parameter VARCHAR2(40);
    var_value VARCHAR2(50);
    var_explication VARCHAR2(1000);
    var_solution VARCHAR2(800);
    var_commentaire VARCHAR2(1000);
     
    WITH TEST_DATA AS (
     
    SELECT TO_CHAR(b.AUDITTIMESTAMP,'YYYY/MM/DD HH24:MI') AS DATE_DEBUT ,
        TO_CHAR(TRUNC(b.DURATION/3600),'FM9900') || ':' ||
          TO_CHAR(TRUNC(MOD(b.DURATION,3600)/60),'FM00') || ':' ||
          TO_CHAR(MOD(b.DURATION,60),'FM00') as DUREE,
          b.ROOTCONTEXTID as UNIQUE_ID,
        b.SERVICENAME,
        tab.SENS,
        tab.INTERFACE,
        b.ERRORMESSAGE,
        ch.Fieldalias as PARAMETER,
        ch.STRINGVALUE as VALUE,
        tab.ID
    FROM bpm.WMSERVICE b, WM_RPT.PROD_TAB_TYPE_ERREUR tab, bpm.WMSERVICECUSTOMFLDS ch
    WHERE b.SERVICENAME = tab.SERVICE
    AND ch.ROOTCONTEXTID = b.ROOTCONTEXTID
          AND b.AUDITTIMESTAMP>=to_date('20160301','YYYYMMDD')
            AND b.AUDITTIMESTAMP<to_date('20160302','YYYYMMDD')
            AND STATUS = '4'
            AND b.ROOTCONTEXTID NOT IN ( SELECT DISTINCT(ROOTCONTEXTID) FROM bpm.WMSERVICECUSTOMFLDS
                  WHERE fieldalias = 'OPCO' AND stringvalue != 'France'
                  AND stringvalue != '%lastError/pipeline/OPCO%'
              )
                  )
     
     
     
    BEGIN
     
     
    FOR LINE IN            
     
                  (
    SELECT b.DATE_DEBUT,b.DUREE,b.UNIQUE_ID,b.SERVICENAME,b.INTERFACE as INTERFACES,
    err.TYPE_ERREUR,
    b.SENS,
    err.IN_CHARGE AS TEAM,
    err.CATEGORIE,
    b.ERRORMESSAGE,
    b.PARAMETER,
    b.VALUE,
    err.EXPLICATION,
    err.SOLUTION,
    err.COMMENTAIRE
    FROM TEST_DATA b,WM_RPT.PROD_TAB_CODE_ERROR_DETAILED err
    WHERE b.ID = err.ID_INTERFACE
    AND b.ERRORMESSAGE LIKE err.CODE_ERREUR
    )
     
    LOOP
     
    dbms_output.put_line(LINE.DATE_DEBUT);
     
     
    END LOOP;
     
     
    END;
    /
    je n'arrive pas a trouver le moyen de pouvoir boucler avec FOR pour recuperer chaque enregistrement ???

    Avez vous une idéee ? peut etre que la solution de choisir une clause WITH n'est pas adequat ??

    Je dois rendre ce script pour demain HELP ME !!!
    Repondez SVP Sur LeMafiozo@hotmail.com MERCI

  2. #2
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 460
    Points : 8 074
    Points
    8 074
    Par défaut
    Citation Envoyé par LeMafiozo Voir le message
    ...j'ai une erreur avec la clause WITH...
    Je dois rendre ce script pour demain
    Si vous ne prenez pas la peine de préciser l'erreur, votre problème n'a guère de chance d'avancer...

    Ceci dit, une clause WITH appartient forcément à un SELECT principal.
    En PL/SQL, on ne met pas un SELECT "brut" dans la partie DECLARE (ou alors un déclare un curseur, mais c'est un autre sujet).
    En PL/SQL, tout SELECT doit être associé à une clause INTO appropriée permettant de stocker les valeurs récupérées.
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

  3. #3
    Membre du Club
    Inscrit en
    Mars 2002
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 68
    Points : 49
    Points
    49
    Par défaut
    Je vais faire un recapitulatif.

    Je souhaite exporter les resultat d'une requete de 4 tables en PL SQL.
    pour des raison d'optimisation ( certaines tables sont > 1G ) en SQL j'utilise une clause WITH sur lequel j'applique un SELECT.
    en PL SQL, je souhaite faire la meme chose et boucler ensuite sur le resultat de la requete SELECT et exporter les donnée par la suite.
    or je n'y arrive pas a bien m'y prendre.

    au final j'ai pu creer une requete SQL ( car je n'arrive pas a inclure une clause WITH et boucler ensuite sur un SELECT avec la clause WITH, je sais pas si vous saisisez ) que je metterai dans mon bloc PL/SQL mais la requete dure une eternité :
    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
     
    SELECT TO_CHAR(b.AUDITTIMESTAMP,'YYYY/MM/DD HH24:MI') AS DATE_DEBUT ,
        TO_CHAR(TRUNC(b.DURATION/3600),'FM9900') || ':' ||
          TO_CHAR(TRUNC(MOD(b.DURATION,3600)/60),'FM00') || ':' ||
          TO_CHAR(MOD(b.DURATION,60),'FM00') as DUREE,
          b.ROOTCONTEXTID as UNIQUE_ID,
        b.SERVICENAME,
        tab.INTERFACE as INTERFACES,
        err.TYPE_ERREUR,
        tab.SENS,
        err.IN_CHARGE AS TEAM,
        err.CATEGORIE,
        b.ERRORMESSAGE,
        ch.Fieldalias as PARAMETER,
        ch.STRINGVALUE as VALUE,
        err.EXPLICATION,
    err.SOLUTION,
    err.COMMENTAIRE
    FROM bpm.WMSERVICE b, WM_RPT.PROD_TAB_TYPE_ERREUR tab, bpm.WMSERVICECUSTOMFLDS ch,WM_RPT.PROD_TAB_CODE_ERROR_DETAILED err
    WHERE b.SERVICENAME = tab.SERVICE
    AND tab.ID = err.ID_INTERFACE
    AND b.ERRORMESSAGE LIKE err.CODE_ERREUR
    AND ch.ROOTCONTEXTID = b.ROOTCONTEXTID
          AND b.AUDITTIMESTAMP>=to_date('20160301','YYYYMMDD')
            AND b.AUDITTIMESTAMP<to_date('20160302','YYYYMMDD')
            AND STATUS = '4'
            AND b.ROOTCONTEXTID NOT IN ( SELECT DISTINCT(ROOTCONTEXTID) FROM bpm.WMSERVICECUSTOMFLDS
                  WHERE fieldalias = 'OPCO' AND stringvalue != 'France'
                  AND stringvalue != '%lastError/pipeline/OPCO%'
              );
    Repondez SVP Sur LeMafiozo@hotmail.com MERCI

  4. #4
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Comme on vous l'a déjà dit la clause With permet de factoriser une sous-requête et fait partie du domaine du langage SQL. Si vous avez des difficultés avec c'est que vous avez des difficultés avec le SQL !
    Le PL/SQL n'est qu'une extension procédurale du SQL et n'inclut pas de instruction With. En gros toute requête présente dans un bloc PL/SQL est normalisée par moteur PL/SQL et ensuite analysée du point de vue de la syntaxe et sémantique. L'exécution de la requête est délégué au moteur SQL lors de l'exécution du bloc PL/SQL.

  5. #5
    Membre du Club
    Inscrit en
    Mars 2002
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 68
    Points : 49
    Points
    49
    Par défaut
    Je comprends ce que vous dites mais je n'arrive pas a trouver une solution pour pouvoir boucler sur le résultat de ma requête et récupérer mes informations ( mon script fonctionne sur SQL DEVELOPER et j'ai bien tout ce qui me faut ).

    Comment vous fera vous ?? là je me sens vraiment bloqué
    Repondez SVP Sur LeMafiozo@hotmail.com MERCI

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Mettez le With dans le for :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for cur_marequete in
    (
    with cte_test as
    (
    select ...
    )
    select * from cte_test 
    )
    loop
        ....
    end loop;

  7. #7
    Membre du Club
    Inscrit en
    Mars 2002
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 68
    Points : 49
    Points
    49
    Par défaut
    Ahhh .... pas mal comme solution...

    en fait j'ai resolu mon probleme en utilisant non pas une boucle WHILE mais une BOUCLE FOR IN liée a mon curseur.

    Je vais me souvenir de cette techniques là !!

    merci encore
    Repondez SVP Sur LeMafiozo@hotmail.com MERCI

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Ce n'est pas une technique, c'est comme mnitu vous l'a expliqué du SQL encapsulé dans du PL/SQL.

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

Discussions similaires

  1. [10gR2] Multiple requêtes sur une clause WITH dans un bloc PL/SQL
    Par LeMafiozo dans le forum PL/SQL
    Réponses: 6
    Dernier message: 03/02/2016, 17h28
  2. Requête avec clause with
    Par maamer dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 20/11/2012, 16h10
  3. PB avec la clause WITH
    Par faflenrage dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 31/08/2006, 17h28
  4. Petit souci avec clause where
    Par ybruant dans le forum SQL
    Réponses: 1
    Dernier message: 21/07/2005, 22h10
  5. installation php avec option --with-pgsql: marche pô.
    Par phil25 dans le forum Requêtes
    Réponses: 3
    Dernier message: 02/01/2004, 15h59

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