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 :

Problème déclaration loop


Sujet :

PL/SQL Oracle

  1. #1
    Futur Membre du Club
    Homme Profil pro
    technicien applicatif
    Inscrit en
    Mars 2018
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : technicien applicatif

    Informations forums :
    Inscription : Mars 2018
    Messages : 11
    Points : 9
    Points
    9
    Par défaut Problème déclaration loop
    Bonjour,

    je rencontre un problème sur mon script m'indiquant que mon curseur est déjà ouvert. Je pense qu'il y a un rapport avec les déclaratives qui doit ouvrir le curseur met en ajoutant des closes derrière il 'indique par la suite un message de type
    CLOSE curs;
    *
    ERREUR à la ligne 30 :
    ORA-06550: Ligne 30, colonne 7 :
    PLS-00488: 'CURS' doit être un type
    ORA-06550: Ligne 30, colonne 7 :
    PL/SQL: Item ignored
    ORA-06550: Ligne 53, colonne 7 :
    PLS-00488: 'CURS2' doit être un type
    ORA-06550: Ligne 53, colonne 7 :
    PL/SQL: Item ignored
    Si je laisse mon fichier tel que présenté ci-dessous, il m'indique donc que le curseur est ouvert

    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
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    Declare
    *
    ERREUR à la ligne 1 :
    ORA-06511: PL/SQL : curseur déjà ouvert
    ORA-06512: à ligne 17
    ORA-06512: à ligne 60
     
     
    LE SCRIPT :
     
    -- Création de deux tables temporaires pour stockage des doublons
     
    create table doublon_md as (Select a.MVI_NOART, MAX(a.MVI_NOMVTINV) AS MVI_NOMVTINV, a.mvi_novidage, a.mvi_noinvent,a.mvi_qtmvtinv
    FROM MGMVI A
    inner join MGMVI B
    on a.mvi_noart=b.mvi_noart
    and a.mvi_novidage=b.mvi_novidage
    and a.mvi_noinvent=b.mvi_noinvent
    and a.mvi_qtmvtinv=b.mvi_qtmvtinv
    where a.mvi_nomvtinv<>b.mvi_nomvtinv
    and a.mvi_noinvent=96
    and a.mvi_noart!=99999999
    group by a.mvi_noart,a.mvi_novidage,a.mvi_noinvent,a.mvi_qtmvtinv);
     
    create table doublon_md1 as (select a.dvi_cdarti as article,
    a.dvi_qtpdrel as qtee,
    a.dvi_novidage as vidage,
    a.dvi_noinvent as invent,
    max(a.dvi_noordre) as ordre,
    a.dvi_cdemp as emplacement
    from mgdvi a
    inner join mgdvi b
    on a.dvi_cdarti=b.dvi_cdarti
    and a.dvi_noinvent=b.dvi_noinvent
    and a.dvi_qtpdrel=b.dvi_qtpdrel
    and a.dvi_cdemp=b.dvi_cdemp
    and a.dvi_novidage=b.dvi_novidage
    where a.dvi_noordre<>b.dvi_noordre
    and a.dvi_cdarti!=99999999
    and a.dvi_noinvent=96
    group by a.dvi_novidage,a.dvi_cdarti,a.dvi_qtpdrel,a.dvi_cdarti,a.dvi_noinvent,a.dvi_cdemp);
     
    Declare 
    article_dvi MGDVI.DVI_CDARTI%TYPE;
    inventaire_dvi MGDVI.DVI_NOINVENT%TYPE;
    vidage_dvi MGDVI.DVI_NOVIDAGE%TYPE;
    ordre_dvi MGDVI.DVI_NOORDRE%TYPE;
    quantite_dvi MGDVI.DVI_QTPDREL%TYPE;
    emplacement_dvi MGDVI.DVI_CDEMP%TYPE;
    article_mvi MGMVI.MVI_NOART%TYPE;
    inventaire_mvi MGMVI.MVI_NOINVENT%TYPE;
    vidage_mvi MGMVI.MVI_NOVIDAGE%TYPE;
    mouvement_mvi MGMVI.MVI_NOMVTINV%TYPE;
    quantite_mvi MGMVI.MVI_QTMVTINV%TYPE;
     
     
    -- Déclaration curseur MVI
    cursor curs is
    Select a.MVI_NOART as article_mvi, MAX(a.MVI_NOMVTINV) AS mouvement_mvi, a.mvi_noinvent as inventaire_mvi,a.mvi_qtmvtinv as quantite_mvi,a.mvi_novidage as vidage_mvi
    FROM MGMVI A
    inner join MGMVI B
    on a.mvi_noart=b.mvi_noart
    and a.mvi_novidage=b.mvi_novidage
    and a.mvi_noinvent=b.mvi_noinvent
    and a.mvi_qtmvtinv=b.mvi_qtmvtinv
    where a.mvi_nomvtinv<>b.mvi_nomvtinv
    and a.mvi_noinvent=96
    and a.mvi_noart!=99999999
    group by a.mvi_noart,a.mvi_novidage,a.mvi_noinvent,a.mvi_qtmvtinv
    order by a.mvi_noart;
     
    CLOSE curs;
     
    -- Déclaration curseur DVI
    cursor curs2 is
    select a.dvi_cdarti as article_dvi,
    a.dvi_qtpdrel as quantite_dvi,
    a.dvi_novidage as vidage_dvi,
    a.dvi_noinvent as inventaire_dvi,
    max(a.dvi_noordre) as ordre_dvi,
    a.dvi_cdemp as emplacement_dvi
    from mgdvi a
    inner join mgdvi b
    on a.dvi_cdarti=b.dvi_cdarti
    and a.dvi_noinvent=b.dvi_noinvent
    and a.dvi_qtpdrel=b.dvi_qtpdrel
    and a.dvi_cdemp=b.dvi_cdemp
    and a.dvi_novidage=b.dvi_novidage
    where a.dvi_noordre<>b.dvi_noordre
    and a.dvi_cdarti!=99999999
    and a.dvi_noinvent=96
    group by a.dvi_novidage,a.dvi_cdarti,a.dvi_qtpdrel,a.dvi_cdarti,a.dvi_noinvent,a.dvi_cdemp
    order by a.dvi_cdarti;
     
    CLOSE curs2;
     
    BEGIN 
    open curs;
    LOOP
    BEGIN
    FETCH curs INTO article_mvi,mouvement_mvi,inventaire_mvi,quantite_mvi,vidage_mvi;
    exit when curs%NOTFOUND;
     
    Dbms_output.put_line('article supprimés :' ||article_mvi|| ' sur inventaire' ||inventaire_mvi|| 'vidage' ||vidage_mvi); 
    for i in curs loop 
    delete mgmvi a
    where a.mvi_noart = i.article_mvi
    and a.mvi_nomvtinv = i.mouvement_mvi
    and a.mvi_novidage = i.vidage_mvi
    and a.mvi_noinvent = i.inventaire_mvi
    and a.mvi_noart <> 99999999 and a.mvi_cdmag=8556;
     
    END loop;
    END;
    END LOOP;
    CLOSE curs;
     
     
    open curs2;
    LOOP
    BEGIN
    FETCH curs2 INTO article_dvi,quantite_dvi,vidage_dvi,inventaire_dvi,ordre_dvi,emplacement_dvi;
    exit when curs%NOTFOUND;
     
    Dbms_output.put_line('article supprimés :' ||article_dvi|| ' sur inventaire' ||inventaire_dvi|| 'vidage' ||vidage_dvi); 
     
    for i in curs2 loop
    delete mgdvi
    where dvi_cdarti = i.article_dvi
    and dvi_noordre = i.ordre_dvi
    and dvi_novidage = i.vidage_dvi
    and dvi_noinvent = i.inventaire_dvi
    and dvi_cdemp = i.emplacement_dvi
    and dvi_cdarti <> 99999999;
    end loop;
    end;
    end loop;
    CLOSE curs2;
     
    end;
     
    /



    PS : désolé ça manque un peu de commentaire mais promis ça va être réglé

  2. #2
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Le "CLOSE curs" ne doit pas suivre la déclaration du curseur mais être mis dans la partie
    BEGIN
    ...
    END;

    Regarde ici : https://www.guru99.com/pl-sql-cursor.html
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  3. #3
    Futur Membre du Club
    Homme Profil pro
    technicien applicatif
    Inscrit en
    Mars 2018
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : technicien applicatif

    Informations forums :
    Inscription : Mars 2018
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Je suis tout à fait d'accord avec toi. Mais mon erreur se rapportant à la partie déclarative je me suis dis pourquoi pas tenter...
    Le problème est que je ne comprend pas l'origine de mon problème, c'est à dire celui-ci ERREUR à la ligne 1 :
    ORA-06511: PL/SQL : curseur déjà ouvert
    ORA-06512: à ligne 17
    ORA-06512: à ligne 60

    Ce message est bien généré avant qu'il puisse aller dans le begin ?

    Mon interrogation est la suivante, déclarer un curseur ouvre ce dernier ? Si oui, ils rentreraient directement en conflit lors de la déclaration d'un second curseur dans la partie déclarative.Et comme tu dis, un close doit être dans le begin alors comment faire?
    Si cela ne pose pas de problème, pourquoi m'indique t-il qu'il est déjà ouvert ? Quelle solution apportée ?

    Je ne comprend pas la subtilité de cette erreur....

  4. #4
    Futur Membre du Club
    Homme Profil pro
    technicien applicatif
    Inscrit en
    Mars 2018
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : technicien applicatif

    Informations forums :
    Inscription : Mars 2018
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Personne à une idée :/ ?

  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
    Vous faite deux boucles différentes à la suite sur le même curseur sans le fermer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [..]
    BEGIN 
    open curs;
    LOOP
    BEGIN
    FETCH curs INTO article_mvi,mouvement_mvi,inventaire_mvi,quantite_mvi,vidage_mvi;
    exit when curs%NOTFOUND;
     
    Dbms_output.put_line('article supprimés :' ||article_mvi|| ' sur inventaire' ||inventaire_mvi|| 'vidage' ||vidage_mvi); 
    for i in curs loop 
    delete mgmvi a
    [..]

Discussions similaires

  1. Problème déclaration variable dans "if"
    Par doremib dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 17/07/2007, 12h42
  2. Problème déclaration variable
    Par patou41000 dans le forum C++/CLI
    Réponses: 5
    Dernier message: 25/04/2007, 01h04
  3. problème déclaration variable dynamique
    Par piotrr dans le forum Tkinter
    Réponses: 1
    Dernier message: 24/04/2007, 16h16
  4. Problème de loop avec animation flash
    Par gyver4000 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 06/04/2007, 09h33
  5. [JS] Problème déclaration de fonction
    Par glloq8 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 23/09/2005, 10h22

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