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 :

Utilisation d'un like dans une procédure


Sujet :

SQL Oracle

  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2011
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 10
    Points : 6
    Points
    6
    Par défaut Utilisation d'un like dans une procédure
    Bonjour à tous,

    Sous Oracle j'ai créé la procédure ci-dessous :

    mais la partie LIKE est KO.

    Seriez vous m'aider?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    delete pmvtsto 
    where 1=1
    and numfiche is null
    and pmvtsto.rdate >= '01/12/2017'
    and pmvtsto.rdate <= '01/02/2018'
    --and pmvtsto.rdate >= sysdate-2
    and pmvtsto.arcode = ligneRec.arcode
    and libmvt like '%lignerec.focode%'
    ;
    End loop;
    Commit;
    End
    Merci!!

  2. #2
    Futur Membre du Club
    Inscrit en
    Mars 2011
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    je ne vous ai pas mis toute la procédure.
    c'est fait.

    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
    create or replace procedure VILO_SUPP_MVT_PREVISION_CONSO 
    is
    begin
    for ligneRec in 
    ( 
            select 
             distinct(pnomenof.arcode)
            ,focode 
            from pordrfab
            inner join pnomenof on pnomenof.OBCLEUNIK = pordrfab.OBCLEUNIK
            where 1=1
            and datemodif >= '01/12/2017'
            and datemodif <= '01/02/2018'
            and focode = '474739'
            and OBETAT = 6
            --and datemodif >= trunc(sysdate) -1
    )
    loop
    delete pmvtsto 
    where 1=1
    and numfiche is null
    and pmvtsto.rdate >= '01/12/2017'
    and pmvtsto.rdate <= '01/02/2018'
    --and pmvtsto.rdate >= sysdate-2
    and pmvtsto.arcode = ligneRec.arcode
    and libmvt like '%lignerec.focode%'
    ;
    End loop;
    Commit;
    End VILO_SUPP_MVT_PREVISION_CONSO;
    j'ai fait des recherches mais rien trouvé pour le moment....
    la procédure fonctionne sans le LIKE...

    Merci!

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Que signifie "la partie LIKE est KO" ?
    Quel est le problème exactement ?
    "La procédure fonctionne sans le LIKE, mais pas avec." Mais encore ? Elle ne supprime rien, pas les bonnes lignes ?

    Il nous faudrait un jeu d'essai, et une description précise du problème.

    Tatayo.

  4. #4
    Futur Membre du Club
    Inscrit en
    Mars 2011
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Merci tatayo

    Je n'ai pas d'erreur au moment de la compilation. quand je l’exécute elle ne me supprime pas ma ligne effectivement. (Proc en test sur base de test)

    la procédure s’exécute correctement sans erreur.

    j'ai testé ma procédure en supprimant le "like" en en faisant un test avec un update. et ça marche.

    Merci

  5. #5
    Membre chevronné
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Points : 1 878
    Points
    1 878
    Par défaut
    Ajouter des traces à l'aide de DBMS_OUTPUT.PUT_LINE pour savoir si vos instructions impactent des lignes
    Par exemple après le delete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    dbms_output.put_line('Nb lignes : '||SQL%ROWCOUNT);
    Pour voir les traces, il faut qu'elles soient activées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    set serveroutput on 
    OU
    set serveroutput on size 1000000

    PS : Un COMMIT dans la procédure n'est pas nécessairement une bonne pratique

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Vous traitez lignerec.focode comme une chaine de caractère, essayez comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    and libmvt like '%'||lignerec.focode||'%'
    PS : utilisez TO_DATE pour éviter une conversion implicite qui se base sur les paramètres de votre session,
    Et attention aux heures, si vous voulez les données de la journée du 01/02, c'est plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    and datemodif >= to_date('01/12/2017','dd/mm/yyyy')
    and datemodif < to_date('01/02/2018','dd/mm/yyyy') + 1

  7. #7
    Futur Membre du Club
    Inscrit en
    Mars 2011
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Merci Scriuiw et skuatamad pour votre aide c'est résolu :

    and libmvt like '%'||lignerec.focode||'%'

    PS : Un COMMIT dans la procédure n'est pas nécessairement une bonne pratique
    Il me semblait que c'était nécessaire? peux tu m'en dire plus?

    Je regarde également pour les traces ça peut être bien pratique!!

    Merci.

  8. #8
    Futur Membre du Club
    Inscrit en
    Mars 2011
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    J'aurais encore une question.

    Peux ton historiser les mouvements supprimés ?

    il est nécessaire pour ça de créer un trigger de type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TRIGGER `suppr`
    BEFORE delete ON `test`
    FOR EACH ROW BEGIN
            insert into `hist` (`id`,`lib`,`hist_date`,`hist_time`,`hist_user`,`hist_comm`) values
            (old.id, old.lib, current_date(), current_time(), user(), "delete");
    END
    Merci.

    J'ai testé les traces, ça fonctionne, et il m'indique le nombre de ligne supprimée.

  9. #9
    Membre chevronné
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Points : 1 878
    Points
    1 878
    Par défaut
    En règle générale, il faut laisser l'appelant décider du COMMIT ou ROLLBACK car c'est lui qui est le mieux placé pour prononcer l'un ou l'autre.
    D'autre part, les COMMIT intermédiaires exécutés implicitement dans des procédures peuvent valider à tort une partie du traitement alors que celui-ci termine en échec.

    On se retrouve alors avec un première partie de traitement exécutée et validée mais une seconde partie en erreur.
    Les données se trouve alors dans une situation bâtarde.

    Par exemple l'enchaînement de procédure suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    BEGIN Pkg de traitement
      Appel Proc 1;
      Appel Proc 2;
      Appel Proc 3;
      COMMIT;
    Exception
      When Others then
        Trace(...);
        ROLLBACK;
    END Pkg
    Si les trois procédures se terminent correctement alors on COMMIT sinon on intercepte l'erreur, on la trace et on fait ROLLBACK ce qui permet de revenir à l'état initiale au niveau des données.


    Maintenant imagine que la procédure 1 contient un COMMIT et qu'on a l'exécution suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Pkg de traitement
      Appel Proc 1 --> COMMIT
      Appel Proc 2 --> ERREUR
      Appel Proc 3
      COMMIT;
    Exception
      When Others then
        Trace(...);
        ROLLBACK;
    End Pkg
    Les modifications de la procédure 1 sont validées mais les données sensées être mises à jour par les proc 2 et 3 restent inchangées car le traitement est parti en exception et a fait un ROLLBACK

    Tu te retrouves avec des données "à moitié" mises à jour.
    - Comment tu rattrapes cela ?
    - Comment tu relances ?
    - Les données sont-elles toujours fonctionnellement consistantes et valides ?


    Après ils existent des cas où il est nécessaire ou préférable d'avoir un COMMIT, notamment lorsque de gros volumes sont traités de façon ensembliste.
    A voir si c'est ton cas.

  10. #10
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 054
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 054
    Points : 9 394
    Points
    9 394
    Par défaut
    Pour éviter les apostrophes et les Pourcents qui peuvent vite devenir lourdingues, on peut aussi faire : where instr(libmvt , lignerec.focode) > 0 ( ou instrb ?)
    Mais pédagogiquement, c'est bien de comprendre pourquoi la première syntaxe ne donnait pas le bon résultat, et pourquoi la proposition de skuatamad fonctionne.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  11. #11
    Futur Membre du Club
    Inscrit en
    Mars 2011
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Merci Scriuiw c'est clair!!

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 28/05/2011, 15h47
  2. Utilisation de try catch dans une procédure de backup de database
    Par megtrinity dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 05/11/2009, 14h53
  3. Utilisation du mot LIKE dans une requete
    Par Astro8899 dans le forum VB.NET
    Réponses: 6
    Dernier message: 27/05/2009, 10h20
  4. [PROC] utiliser des données selectionnées dans une procédure.
    Par ellix86 dans le forum Développement
    Réponses: 5
    Dernier message: 17/04/2009, 13h08
  5. Problème avec un LIKE dans une procédure stockée
    Par Oluha dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 22/12/2004, 14h38

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