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 :

Multiple requêtes sur une clause WITH dans un bloc PL/SQL [10gR2]


Sujet :

PL/SQL Oracle

  1. #1
    Membre actif
    Inscrit en
    Mars 2002
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 68
    Par défaut Multiple requêtes sur une clause WITH dans un bloc PL/SQL
    bonsoir

    j'ai plusieurs requetes a faire sur une bdd en prod et je souhaite utiliser un bloc Clause WITH AS dans lequel je requeterai afin d'avoir des enregistrements que je veux, puis ensuite j'enchaine des prod stock sur la clause WITH AS et je vais utiliser des RECORDS pour stocker les valeurs et pouvoir les traiter.

    j'ai fait une ebauche test mais j'ai un message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Rapport d'erreur -
    ORA-01403: aucune donnée trouvée
    ORA-06512: à ligne 18
    01403. 00000 -  "no data found"
    Voici mon Bloc PL

    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
    DECLARE
     
    type log is record(audittime TIMESTAMP,
                       duree INTEGER,
                       inter VARCHAR2(30),
                       pack VARCHAR2(20),
                       service VARCHAR2(50),
                       status INTEGER,
                       operation VARCHAR2(20),
                       errormsg VARCHAR2(200));
     
    row log;
     
     
    BEGIN
     
     
    WITH TEST_DATA AS
      (SELECT AUDITTIMESTAMP,DURATION,STATUS,SERVICENAME,ERRORMESSAGE FROM wmservice 
              WHERE AUDITTIMESTAMP>=to_date('20160123','YYYYMMDD')
              AND AUDITTIMESTAMP<=to_date('20160127','YYYYMMDD')
              )
     
     
     
    SELECT AUDITTIMESTAMP AS DATEDEBUT,
        TO_CHAR(TRUNC(DURATION/3600),'FM9900') || ':' ||
        TO_CHAR(TRUNC(MOD(DURATION,3600)/60),'FM00') || ':' ||
        TO_CHAR(MOD(DURATION,60),'FM00') as DUREE,
        'TEST' as INTERFACE,
        SUBSTR(SERVICENAME,1, INSTR(SERVICENAME,'.')-1) AS PACKAGE,
          SUBSTR(SERVICENAME, INSTR(SERVICENAME, '.')+1, INSTR(SERVICENAME, ':')-13) AS SERVICE,
           SUBSTR(SERVICENAME, INSTR(SERVICENAME,':')+1) AS OPERATION,
        STATUS,ERRORMESSAGE
     
        INTO row.audittime,row.duree,row.inter,row.pack,row.service,row.status,row.operation,row.errormsg
     
        FROM TEST_DATA
    WHERE AUDITTIMESTAMP>=to_date('20160115','YYYYMMDD')
    AND AUDITTIMESTAMP<=to_date('20160125','YYYYMMDD')
    AND ( SERVICENAME LIKE 'TESTSERVICE')
    AND STATUS = 4;
     
     
    /* UTILISATION DE PROD STOCK et de UTL_FILE*/
     
      NULL;
    END;
    /
    J'imagine que la clause WITH n'a pas fonctionné car la requete est correcte ( test ok )

    Avez vous une idée du pourquoi ?
    mon but est de creer des statistique pour generer plusieurs tableaux detaillé sur 3 niveau.

    MERCI POUR VOTRE AIDE

  2. #2
    Expert confirmé 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
    Par défaut
    L'erreur que vous rencontrez est une erreur d'exécution. Elle vous signale que le select ... Into ... que vous avez exécuté ne ramène aucun enregistrement. Dans ce cas PL/SQL génère une exception de Type NO_DATA_FOUND (Ora-01403), interrompe l'exécution du code PL/SQL et passe la main à un éventuel gestionnaire d'exceptions du bloc PL/SQL. Dans votre cas il n'y pas et par voie de conséquence l'exception est propagée vers l'environnement appelant.

  3. #3
    Membre actif
    Inscrit en
    Mars 2002
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 68
    Par défaut
    Oui je conçoit tout a fait que la requete SELECT INTO ne ramene aucun enregistrement ce qui laisse supposer que la clause WITH AS ne rapporte aucune enregistrement j'imagine mais elle fonctionne bien.

    Dans ce cas là peut etre que ma requete sur une table correspondant a un WITH AS ne fonctionne pas dans un bloc PL/SQL;

    je ne vois pas ou est le probleme sincerement...

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 952
    Par défaut
    Citation Envoyé par LeMafiozo Voir le message
    j'ai plusieurs requetes a faire sur une bdd en prod et je souhaite utiliser un bloc Clause WITH AS dans lequel je requeterai afin d'avoir des enregistrements que je veux, puis ensuite j'enchaine des prod stock sur la clause WITH AS et je vais utiliser des RECORDS pour stocker les valeurs et pouvoir les traiter.
    Attention, la façon dont vous vous exprimez laisse supposer que vous appréhendez mal la clause WITH (mais peut être que c'est une mauvaise interprétation de ma part).

    La clause WITH est complètement liée au SELECT qui suit ligne 26 dans votre code et uniquement à celui-ci, ce n'est pas un moyen de générer une "table temporaire" ou un moyen de factoriser ce code pour l'ensemble de la procédure. Ca permet de factoriser une partie du code d'un seul SELECT final.
    Peut être que ce dont vous avez besoin est juste une VUE, ou une VUE MATERIALISEE, ou une GLOBAL TEMPORARY TABLE.

    Par ailleurs avec un SELECT INTO, vous ne pouvez pas avoir plusieurs lignes renvoyées (comme la variable row le laisse supposer) par le select non plus (c'est une et une seule), vous devez donc passer par un curseur ou par du BULK COLLECT dans une collection.

    PS : Qu'est ce qu'une PROD STOCK ? Une procédure stockée ?

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 544
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 544
    Billets dans le blog
    10
    Par défaut
    Ce que vous appelez une 'requete WITH AS" est une CTE (common table expression)
    Si le contenu de la requete décrite dans la CTE fonctionne et ne ramène pas un ensemble vide, c'est donc que les filtres appliqués sur la requete qui lit la CTE ne retiennent aucun enregistrement

    Ce qui est curieux c'est que dans la CTE vous filtrez du 23-01-2016 au 27-01-2016
    Mais ensuite vous filtrez du 15-01-2016 au 25-01-2016
    Ca laisse peu de dates dans l'intersection (dont un WE)
    Sinon regardez les 2 autres filtres : "AND ( SERVICENAME LIKE 'TESTSERVICE') AND STATUS = 4;"

  6. #6
    Expert confirmé 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
    Par défaut
    Citation Envoyé par LeMafiozo Voir le message
    Oui je conçoit tout a fait que la requete SELECT INTO ne ramene aucun enregistrement ce qui laisse supposer que la clause WITH AS ne rapporte aucune enregistrement j'imagine mais elle fonctionne bien.

    Dans ce cas là peut etre que ma requete sur une table correspondant a un WITH AS ne fonctionne pas dans un bloc PL/SQL;

    je ne vois pas ou est le probleme sincerement...
    Que est-ce que vous enseigné la réalité ?
    Les faits: la requête exécuté par le bloc PL/SQL ne ramène aucune enregistrement! Ca c'est quelque chose d'indéniable!

    Est-ce que vous pouvez vérifier ?
    Oui! Vous faite un copiez/coller de votre requête dans sqlplus ou autre outil et vous supprimez seulement la partie spécifique à PL/SQL qui est la clause INTO. Cette requête ne ramène rien.

    Dans le cas contraire deux explications:
    • soit vous exécutez la requête sur une autre base que celle ou le block PL/SQL a été exécuté
    • soit vous devez arrêter le pastis du matin


    Ne cherchez pas des explications occultes "ma requete sur une table correspondant a un WITH AS ne fonctionne pas dans un bloc PL/SQL" quand vous faite de la programmation.

  7. #7
    Membre actif
    Inscrit en
    Mars 2002
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 68
    Par défaut
    ma femme me saoule deja pas besoin de pastis !!

    merci pour vos reponses , je me suis bien tromper !!

    de plus je vais plutot utiliser une VIEW au final !!

    peut etre que vous allez voir d'autre topic concernant mon reporting!!

    MERCI ENCORE !!!

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/09/2009, 00h50
  2. Réponses: 2
    Dernier message: 17/06/2009, 10h12
  3. IF sur une variable SHELL dans un bout de SQL
    Par nicolas.pailheret dans le forum Linux
    Réponses: 4
    Dernier message: 15/05/2009, 14h15
  4. Requête sur une base access dans excel
    Par adrien.gendre dans le forum Excel
    Réponses: 3
    Dernier message: 23/07/2007, 12h06
  5. Réponses: 10
    Dernier message: 12/03/2007, 12h06

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