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 curseur en for update.


Sujet :

SQL Oracle

  1. #1
    Membre averti Avatar de macben
    Inscrit en
    Mars 2004
    Messages
    546
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2004
    Messages : 546
    Points : 433
    Points
    433
    Par défaut Utilisation d'un curseur en for update.
    Bonjour,

    J'ai le curseur suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select * from maTable where col1 = '16' and col2 is null
    Cette requête ne ramène aucun résultat car la seule ligne avec col1 = '16' n'a pas col2 a null.

    Or si je fais un curseur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CURSOR monCurseur IS Select * from maTable where col1 = '16' and col2 is null for update;
    Et que je parcours mon curseur celui-ci me ramène une ligne correspondant à ma ligne col1 = '16' mais sans tenir compte la seconde restriction col2 is null !

    Si j'enlève le for update, aucun ligne ne m'ait ramenée.

    Quelle est l'incidence du for update sur un curseur ?

    Merci.

  2. #2
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    La clause FOR UPDATE pose un verrou exclusif sur les lignes retournées par le curseur: la requête peut être mise en attente jusqu'à ce qu'une autre transaction qui verrouille les mêmes données se soit terminée.

    Quelle est la version d'Oracle ?
    Y-a-t-il des mises à jour sur les mêmes données par d'autres transactions concurrentes ?
    Pouvez-vous reproduire systématiquement le problème ?

  3. #3
    Membre averti Avatar de macben
    Inscrit en
    Mars 2004
    Messages
    546
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2004
    Messages : 546
    Points : 433
    Points
    433
    Par défaut
    Citation Envoyé par pifor Voir le message
    Quelle est la version d'Oracle ?
    Y-a-t-il des mises à jour sur les mêmes données par d'autres transactions concurrentes ?
    Pouvez-vous reproduire systématiquement le problème ?
    La version d'Oracle est 10.2.0.2.0

    Aucune maj n'est en cours sur la table.

    C'est reproductible systématiquement.

    Curieux.

  4. #4
    Membre averti Avatar de LBO72
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 342
    Points
    342
    Par défaut
    Je ne vois vraiment pas, mais pourrais-tu tester avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monCurseur IS Select * from maTable where (col1 = '16' and col2 is null ) for update;

  5. #5
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Le problème peut-il être reproduit avec le script suivant:


    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
    set echo on
    spool tcfu.log
     
    set serveroutput on
    select * from v$version;
     
    drop table mt;
     
    create table mt (col1 varchar2(10), col2 number, col3 number);
    insert into mt values ('16', null, 1);
    insert into mt values ('16', 16, 2);
    commit;
     
    select * from mt where col1 = '16' and col2 is null;
     
    declare
    cursor cfu is select * from mt where col1 = '16' and col2 is null for update; 
    cursor c is select * from mt where col1 = '16' and col2 is null; 
    begin
    for r in cfu 
    loop
     dbms_output.put_line('cfu: '|| r.col3);
    end loop;
    for r in c
    loop
     dbms_output.put_line('c: '|| r.col3);
    end loop;
    end;
    /
    show errors
    Si oui, vous avez trouvé un bug Oracle. Sinon, êtes-vous sûr de votre code ? Pouvez reproduire le résultat avec un script similaire ?

Discussions similaires

  1. Réponses: 15
    Dernier message: 26/11/2014, 14h30
  2. Réponses: 10
    Dernier message: 06/07/2012, 15h39
  3. Réponses: 1
    Dernier message: 24/09/2010, 19h01
  4. problème avec curseur "for update"
    Par funkyjul dans le forum Développement
    Réponses: 3
    Dernier message: 21/01/2009, 11h55
  5. Réponses: 3
    Dernier message: 11/03/2004, 10h58

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