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

  1. #1
    Candidat au Club
    Inscrit en
    Avril 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 4
    Points : 2
    Points
    2
    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é
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    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
    Candidat au Club
    Inscrit en
    Avril 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 4
    Points : 2
    Points
    2
    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 chevronné

    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
    Points : 1 775
    Points
    1 775
    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 ?
    Modérateur des forums Oracle et Langage SQL
    Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum

  5. #5
    Candidat au Club
    Inscrit en
    Avril 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 4
    Points : 2
    Points
    2
    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 actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2005
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    Points : 277
    Points
    277
    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...
    Dyvim

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    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 !
    Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

    Yorglaa

  8. #8
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    As-tu essayé un truc comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UPDATE amempldept e
    SET lcompanyid =(SELECT lcompanyid 
                     FROM amcompany  c
                     WHERE c.code IN (SELECT barcode FROM amempldept WHERE slvl = 0)
                     AND Substr(e.fullname,2,Instr(Substr(e.fullname,2),'/')-1) = c.code) 
    WHERE lcompanyid = 0 ;
    Ce n'est pas dans la norme, mais ORACLE autorise les alias dans les UPDATE. Dans cette requête tu risques de mettre à NULL des lignes qui ne sont pas trouvée (dans ce cas il faut ajouter un AND EXISTS...).
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

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