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 :

Cursor vide mais pas vraiment


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2009
    Messages : 85
    Points : 62
    Points
    62
    Par défaut Cursor vide mais pas vraiment
    Voici le code d'un trigger sous Oracle 10g dont le but est de faire autant d'insertion dans outside_order qu'il y a d'éléments dans le cursor spec1 lorsque le status devient 3 et que v_spec_status = 6.

    PS : Le code de ce trigger représente qu'un exemple du véritable code.

    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    create or replace
    TRIGGER SPEC_ORDER
    AFTER UPDATE OF ORDER ON STATUS
    REFERENCING OLD AS OLD NEW AS NEW 
    FOR EACH ROW 
    WHEN (new.status = 3) 
     
    DECLARE
     
    -- Toutes les variables sont de type number 
    v_spec1_id    spec.spec1_id%TYPE;
    v_spec2_id    spec.spec2_id%TYPE;
    v_spec_status   spec.status%TYPE;
     
    CURSOR spec1 IS
          SELECT id 
          FROM topology
          WHERE id  = :old.spec1_id
          ORDER BY id;
     
    BEGIN
     
    OPEN spec1;
    dbms_output.put_line('Phase 1 after open spec1' );
    LOOP
    dbms_output.put_line('Phase 2 inside loop' );
    FETCH spec INTO v_spec1_id;
    dbms_output.put_line('Phase 3 the content of v_spec1_id :' ||v_spec1_id);
    EXIT WHEN spec1%NOTFOUND;
     
         SELECT id, status
         INTO v_spec1_id, v_spec_status
         FROM spec
         WHERE spec_id = v_spec1_id;
     
    dbms_output.put_line('Phase1 Inside the third part of trigger v_spec_status :' ||v_spec_status);
     
    IF v_spec_status = 6 THEN
     
    INSERT INTO outside_order ( order_id,
                          sla_id,
                          order_type,
                          order_from,
                          order_dt,
                          order_status,
                          expected_delivery_dt,
                          external_ref,
                          commercial_id,
                          qty,
                          spec1_id,
                          pre_id,
                          p_spec_id,
                          p_pre_id,
                          spec2_id,
                          production_location,
                          delivered_to,
                          actual_delivery_dt,
                          commentry)
                VALUES
                          (order_id_seq.nextval,
                           2,
                           'INTERN',
                           'Database',
                           sysdate,
                           'IN PROGRESS',
                           NULL,
                           NULL,
                           NULL,
                           NULL,
                           v_spec1_id,
                           NULL,
                           NULL,
                           NULL,
                           :old.spec_id,
                           'TEST',
                           NULL,
                           NULL,
                           NULL);
     
    END IF;
     
    END LOOP; 
     
    END;
    Et bien voilà le problème, lorsque la j'ai un élément dans le cursor spec1 cela fonctionne alors le trigger se déclenche puis fait l'insertion. Mais lorsque il y a, par exemple 2 valeurs, donc que le select du cursor
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT id 
          FROM topology
          WHERE id  = :old.spec1_id
          ORDER BY id;
    retourne 125 et 127 alors pourquoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dbms_output.put_line('Phase 3 the content of v_spec_id :' ||v_spec1_id);
    la variable v_spec1_id est vide et par conséquence aucune insertion n'est faite?

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2009
    Messages : 85
    Points : 62
    Points
    62
    Par défaut
    C'est bon, j'ai trouvé !

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

Discussions similaires

  1. [UI] Accordion collaspe mais pas vraiment
    Par Pelote2012 dans le forum jQuery
    Réponses: 3
    Dernier message: 25/02/2014, 14h31
  2. chroot, mais pas vraiment chroot
    Par Emmanuel Deloget dans le forum Applications et environnements graphiques
    Réponses: 6
    Dernier message: 01/12/2009, 17h08
  3. [AJAX] Résultat de requête Ajax vide sous IE, mais pas sous FF
    Par brazilia28 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 14/09/2007, 16h18
  4. [Upload] Upload réussi mais pas vraiment
    Par Roromix dans le forum Langage
    Réponses: 11
    Dernier message: 26/03/2007, 16h25
  5. [PL/SQL] requete qui marche mais pas dans un cursor
    Par victor.ward dans le forum Langage SQL
    Réponses: 3
    Dernier message: 09/09/2005, 22h21

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