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 :

Procédure stockée simple


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Par défaut Procédure stockée simple
    Bonjour,

    Je cherche à écrire une procédure stockée très simple, sauf que je n'y connais pas grand chose en PL/SQL et c'est à moi de me débrouiller ...

    J'ai potassé, fait des essais, FETCH, CURSOR, tout ça je m'en sors pas :/

    Voici ce que je voudrais :

    J'ai une table de log qui liste les erreurs (bloquantes ou non) de l'intégration automatique de commandes.
    Dans cette table de log, j'ai une ligne par erreur. Chaque ligne a un statut :
    - soit (null)
    - soit 'I' comme intégré. Dans ce cas, sauf erreur informatique, la commande ne contient qu'une ligne de log, dans ce cas, la commande elle même est dite intégrée.
    - soit 'R' comme rejeté.
    --> S'il n'y a qu'une ligne de log et qu'elle est 'R', la commande elle même est dite rejetée.
    --> S'il 'y a plusieurs lignes et qu'elles sont toutes 'R', la commande elle même est dite rejetée.
    --> S'il 'y a plusieurs lignes et qu'elles sont indifféremment (null) ou 'R', la commande DOIT ETRE considérée comme rejetée, c'est à dire qu'il faut mettre à jour toutes les lignes de log à 'R'

    Exemple

    Commande Etat
    COM01 I
    COM02 R
    COM03 R
    COM03 R
    COM04 (null)
    COM04 R


    --> COM01 = Intégrée
    --> COM02 = Rejetée
    --> COM03 = Rejetée
    --> COM04 = Rejetée et la première ligne doit etre mise à jour.

    En gros mon idée :
    - Faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT commande FROM MA_TABLE
    - Boucler sur ces commandes
    - Dans la boucle faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT etat FROM MA_TABLE where commande = numero_de_commande récupéré_plus_haut
    --> Si une seule ligne, on passe à la commande suivante
    --> Si plusieurs lignes, on regarde si les valeurs de chaque ligne sont identiques
    --> Si elles sont identiques, on passe à la commande suivante
    --> Si elles ne sont pas identiques, dès qu'on récupère un 'R', on s'arrete et on fait un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE MA_TABLE set etat='R' where commande = numero_de_commande récupéré_plus_haut
    Quelqu'un peut-il m'aider ?
    D'avance merci

  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
    Nul besoin d'écrire une procédure la où un update suffit
    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
     
    Connected to Oracle9i Enterprise Edition Release 9.2.0.1.0 
    Connected as mni
     
    SQL> 
    SQL> drop table t_commande
      2  /
     
    Table dropped
    SQL> create table t_commande (
      2    commande    varchar2(10),
      3    statut      varchar2(1)
      4  )
      5  /
     
    Table created
    SQL> insert ALL
      2    into t_commande Values(commande, status)
      3    Select 'COM01' commande, 'I' status From dual Union All
      4    Select 'COM02' commande, 'R' status From dual Union All
      5    Select 'COM03' commande, 'R' status From dual Union All
      6    Select 'COM03' commande, 'R' status From dual Union All
      7    Select 'COM04' commande, Null status From dual Union All
      8    Select 'COM04' commande, 'R' status From dual
      9  /
     
    6 rows inserted
    SQL> commit
      2  /
     
    Commit complete
    SQL> Select * from t_commande
      2  /
     
    COMMANDE   STATUT
    ---------- ------
    COM01      I
    COM02      R
    COM03      R
    COM03      R
    COM04      
    COM04      R
     
    6 rows selected
    SQL> Update t_commande
      2    set statut = 'R'
      3   Where (statut != 'R' Or statut Is Null)
      4     And commande In (Select commande
      5                        From t_commande t1
      6                       Group By commande
      7                       Having Count(*) > 1
      8                          And min(Nvl(statut,'I')) != 'R'
      9                      )
     10  /
     
    1 row updated
    SQL> Select * from t_commande
      2  /
     
    COMMANDE   STATUT
    ---------- ------
    COM01      I
    COM02      R
    COM03      R
    COM03      R
    COM04      R
    COM04      R
     
    6 rows selected
     
    SQL>

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Par défaut
    Oh merci mnitu , le NVL super j'y aurais pas pensé

    Le "problème" c'est que ce morceau de code doit être exécuté après une procédure stockée, c'est pour ca que je pensais appeler une autre procédure stockée... Je peux mettre ce bout de code dans une prock stock direct ?...

  4. #4
    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
    Vous pouvez toujours écrire une procédure PL/SQL qui fait l’update en question. C’est la seule façon optimale de résoudre ce type de problème.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Par défaut
    Mintu, merci pour vos réponses !

    Cependant j'ai un petit souci avec la requête car j'ai commis une erreur en disant

    - soit 'I' comme intégré. Dans ce cas, sauf erreur informatique, la commande ne contient qu'une ligne de log, dans ce cas, la commande elle même est dite intégrée.

    C'est faux, une commande peut avoir une ligne à 'I' et une ligne à (null) (null = rejet non bloquant pour l'intégration).

    On a donc en fait :
    R + null = R
    I + null = I

    En gros dès qu'il y a un R, la commande est rejetée, sinon elle est intégrée.

    Comment puis-je modifier la requête pour parvenir à ce résultat ?

    Merci !!

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Par défaut
    Ah bah non en fait ça marche quand même
    Je suis pas réveillée !!

    Ta requête elle va faire que

    R + null = R + I ==> = R
    I + null = I + I ==> = I

    Donc c'est bon !!!


    Sorry

    Et merci !!

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

Discussions similaires

  1. Procédure stockée simple
    Par vistar76 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 17/10/2010, 21h37
  2. simple select plus performant que procédure stockée
    Par dens19 dans le forum Développement
    Réponses: 5
    Dernier message: 01/09/2010, 10h36
  3. Procédure Stockée des plus simples
    Par cotede2 dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 17/04/2009, 13h42
  4. Procédure stockée simple
    Par popovitch130 dans le forum SQL Procédural
    Réponses: 0
    Dernier message: 29/08/2008, 12h57
  5. Procédure stockée : comment faire plus simple / plus fiable ?
    Par allaume dans le forum Accès aux données
    Réponses: 1
    Dernier message: 08/08/2007, 12h17

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