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 :

PL/SQL : Curseurs imbriqués


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 4
    Par défaut PL/SQL : Curseurs imbriqués
    Tout d'abord bonjour à vous

    Je vais tenter de vous expliquer au mieux mon problèmes. J'ai créé deux requêtes SQL, l'une depend de l'autre. La requête sera lancé par un script shell sous unix.

    Je situe le contexte :

    1) premièrement on liste les codes des company qui nous interessent

    select code from amcompany where code in(select barcode from amempldept where slvl=0);


    2) deuxiemement, pour chacun de ses codes on fait la requete suivante (exemple) :

    update amempldept set lcompanyid=(select lcompanyid from amcompany where code='SB') where lcompanyid=0 and substr(fullname,2,instr(substr(fullname,2),'/')-1)='SB'


    Ma question :
    Est il possible de faire une boucle ou quelque chose de ce genre (pointeur je crois) pour faire ce type de traitement en un seul script ?

    Si oui, pourriez vous m'aiguiller vers une solution, ou me fournir des sources permettant de m'enrichir vers cette voie ?

    Merci à ceux qui ont pris le temps de me lire ! ^^
    a+

  2. #2
    Xo
    Xo est déconnecté
    Membre Expert
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Par défaut
    Non, ce n'est pas possible en SQL, il faut utiliser le langage procédural de ton SGBD, en l'occurence le PL/SQL, et utiliser des curseurs.

    Plus d'infos ici :
    - Tous les cours Oracle : http://oracle.developpez.com/cours/
    - Cours sur le PL/SQL : http://sheikyerbouti.developpez.com/pl_sql/
    (cf le 1.2.22 en particulier)
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  3. #3
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 4
    Par défaut
    Tout d'abord grand merci.

    Donc voilà ce que j'ai concocté, ça à l'air de fonctionner correctement.

    Par contre, si vous voyez une abération n'hésitez pas à me le signaler ^^


    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
    Declare
    -- déclaration du curseur
    CURSOR C_COMP IS
    select code from amcompany where code in(select barcode from amempldept where slvl=0);
    -- variables d'accueil 
    LC$Code amcompany.code%Type;
     
    Begin
    Open C_COMP; -- ouverture du curseur
    Loop -- boucle sur les lignes
    Fetch C_COMP Into LC$Code; -- Lecture d'une ligne
    update amempldept set lcompanyid=(select lcpyid from amcompany where code=LC$Code) where lcompanyid=0 and substr(fullname,2,instr(substr(fullname,2),'/')-1)=LC$Code; -- update
    Exit When C_COMP%NOTFOUND; -- sortie lorsque le curseur ne ramène plus de ligne 
    End loop;
    Close C_COMP; -- fermeture du curseur
    End;
    /

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    Citation Envoyé par Prismadeath
    Par contre, si vous voyez une abération n'hésitez pas à me le signaler ^^
    Je pense qu'il faut intervertir la ligne EXIT WHEN... et celle qui réalise l'UPDATE car lorsque C_COMP%NOTFOUND retourne True tu effectues quand même un UPDATE avant de quitter ta boucle.

    D'ailleurs j'imagine que ton code doit te générer une erreur Oracle non ?

  5. #5
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 4
    Par défaut
    Non je n'ai aucune bizarrement aucune erreur :/

    Mais bon tu as raison, vaudrait mieux peut etre inverser ces deux lignes !

  6. #6
    Membre expérimenté
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2005
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 250
    Par défaut
    Je te conseille d'utiliser une boucle FOR pour ton curseur cela devrait améliorer la lisibilité et te dispenser de ton EXIT...

    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
     Declare
     
    CURSOR C_COMP IS
    select code 
    from amcompany 
    where code in(select barcode 
                       from amempldept 
                       where slvl=0);
     
    Begin
    FOR C IN  C_COMP 
    Loop
     
    update amempldept 
    set lcompanyid=(select lcpyid 
                          from amcompany 
                          where code=C.Code) 
    where lcompanyid=0 
    and   substr(fullname,2,instr(substr(fullname,2),'/')-1)=C.Code; 
     
    End loop;
     
    End;
    /
    Ceci dit un curseur pour des update peut représenter des problèmes de perf. Utiliser le SQL uniquement pourrait te faire gagner du temps.
    De plus utiliser la fonction substr dans ta clause where (dans la partie gauche de ta clause) t'empêche d'utiliser les index...

  7. #7
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    Citation Envoyé par dyvim
    ...De plus utiliser la fonction substr dans ta clause where (dans la partie gauche de ta clause) t'empêche d'utiliser les index...
    ... à moins de créer un index qui contient déjà la fonction !

Discussions similaires

  1. Transact SQL - Curseurs
    Par fanch17 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 31/03/2005, 17h31
  2. T-SQL curseurs
    Par fanch17 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 31/03/2005, 13h51
  3. [PL/SQL]requête imbriquée
    Par Nadine dans le forum Oracle
    Réponses: 6
    Dernier message: 01/02/2005, 16h21
  4. [PL/SQL) Curseur et nom de champ explicite
    Par Loko dans le forum Oracle
    Réponses: 6
    Dernier message: 01/12/2004, 15h07
  5. [PL/SQL] Curseur avec Paramètre
    Par blids dans le forum Oracle
    Réponses: 5
    Dernier message: 10/10/2004, 20h07

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