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 :

procedure stockée erreur


Sujet :

PL/SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    178
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 178
    Points : 40
    Points
    40
    Par défaut procedure stockée erreur
    Bonjour, je suis en train d'essayer de faire une procédure stockée mais lorsque je l'éxécute dans SQL/PLUS, j'ai l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Avertissement : Procédure créée avec erreurs de compilation.
    Le code de ma procédure stockée est :
    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
     
    CREATE OR REPLACE PROCEDURE ps_concat_crit(IN etab_naiss integer,IN no_immeuble integer,IN no_lot char(5)) AS
     
    CURSOR GetCrit IS SELECT * FROM P_DESG WHERE  DSG_Domaine_Appli='Lot' AND DSG_No_Etab_Nais=etab_naiss AND DSG_No_Immeuble=no_immeuble AND DSG_No_Lot=no_lot;
    CURSOR existEnreg IS SELECT COUNT(*) FROM T_Lots_crit WHERE TLC_No_Etab_Naiss=etab_naiss AND TLC_No_Imm=no_immeuble AND TLC_No_Lot=no_lot;
     
    crits varchar2;
    niu_courant P_DESG%ROWTYPE;
    NbEnreg integer;
     
    BEGIN
     
     FOR niu_courant IN GetCrit
     LOOP
       crits := ltrim(rtrim(crits)) || 'NIU' || niu_courant.DSG_NIU || '=' || niu_courant.DSG_Valeur_descriptif || ';';
     END LOOP;
     
     FOR NbEnreg IN existEnreg
     LOOP
      IF NbEnreg=0 THEN
        INSERT INTO T_Lots_crit(TLC_No_Etab_Naiss,TLC_No_Imm,TLC_No_Lot,TLC_Crit) VALUES (etab_naiss,no_immeuble,no_lot,crits);
      ELSE
        UPDATE T_Lots_crit SET TLC_Crit=crits WHERE TLC_No_Etab_Naiss=etab_naiss AND TLC_No_Imm=no_immeuble AND TLC_No_Lot=no_lot;
      END IF; 
     END LOOP;
    END;
    Si quelqu'un a une idée ou une piste pour que j'arrive a compiler cette procédure stockée correctement je suis preneur.
    Merci d'avance.

  2. #2
    Membre expérimenté Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Points : 1 332
    Points
    1 332
    Par défaut
    Bonjour,

    sous sqlplus
    par exemple apres avoir lancé la proce de creation

    tu fais

    au moins on va voir les erreurs

    c'est un bon debut

    asktom.oracle.com tahiti.oracle.com otn.oracle.com

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.


    phrase chinoise issue du Huainanzi

  3. #3
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    178
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 178
    Points : 40
    Points
    40
    Par défaut
    Je viens de faire ce que tu m'

  4. #4
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    178
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 178
    Points : 40
    Points
    40
    Par défaut
    Je viens de faire ce que tu m'as dit du coup j'ai réussi a corriger quelque erreur par contre j'ai une erreur que je ne comprend pas la je te redonne la procédure stockée modifié :
    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
     
    CREATE OR REPLACE PROCEDURE ps_concat_crit(etab_naiss IN integer, no_immeuble IN integer, no_lot IN char) AS
     
    CURSOR GetCrit IS SELECT * FROM P_DESG WHERE  DSG_Domaine_Appli='Lot' AND DSG_No_Etab_Nais=etab_naiss AND DSG_No_Immeuble=no_immeuble AND DSG_No_Lot=no_lot;
    CURSOR existEnreg IS SELECT COUNT(*) FROM T_Lots_crit WHERE TLC_No_Etab_Naiss=etab_naiss AND TLC_No_Imm=no_immeuble AND TLC_No_Lot=no_lot;
     
    crits varchar2(30000);
    niu_courant P_DESG%ROWTYPE;
    NbEnreg integer;
     
    BEGIN
     
     FOR niu_courant IN GetCrit LOOP
       crits := TRIM(crits) || 'NIU' || To_char(niu_courant.DSG_NIU) || '=' || niu_courant.DSG_Valeur_descriptif || ';';
     END LOOP;
     
     FOR NbEnreg IN existEnreg LOOP
      IF (NbEnreg=0) THEN
        INSERT INTO T_Lots_crit(TLC_No_Etab_Naiss,TLC_No_Imm,TLC_No_Lot,TLC_Crit) VALUES (etab_naiss,no_immeuble,no_lot,crits);
      ELSE
        UPDATE T_Lots_crit SET TLC_Crit=crits WHERE TLC_No_Etab_Naiss=etab_naiss AND TLC_No_Imm=no_immeuble AND TLC_No_Lot=no_lot;
      END IF; 
     END LOOP;
    END;
    /
    SET serverout ON
    show error
    et le message d'erreur que je ne comprend pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Avertissement : Procédure créée avec erreurs de compilation.
     
    Erreurs pour PROCEDURE PS_CONCAT_CRIT :
     
    LINE/COL ERROR
    -------- -----------------------------------------------------------------
    17/3     PL/SQL: Statement ignored
    17/14    PLS-00306: numéro ou types d'arguments erronés dans appel à '='
    Merci de m'aider la je sèche.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 136
    Points : 112
    Points
    112
    Par défaut
    Il n'y a pas les numéros de ligne, tu peux les afficher ou bien indiquer laquelle est ta ligne 17? (je ne sais pas si ça prend en compte les lignes vides...)

    C'est surement une erreur du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE TLC_No_Etab_Naiss=etab_naiss
    alors que etab_naiss est un integer, alors que TLC_No_Etab_Naiss est défini comme une chaine dans ta table.

  6. #6
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    178
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 178
    Points : 40
    Points
    40
    Par défaut
    Merci pour ton aide, je viens de trouver la solution voici le code de ma procedure stockée :
    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
     
    CREATE OR REPLACE PROCEDURE ps_concat_crit(etab_naiss IN integer, no_immeuble IN integer, no_lot IN char) AS
     
    CURSOR GetCrit IS SELECT * FROM P_DESG WHERE  DSG_Domaine_Appli='Lot' AND DSG_No_Etab_Nais=etab_naiss AND DSG_No_Immeuble=no_immeuble AND DSG_No_Lot=no_lot;
    CURSOR existEnreg IS SELECT COUNT(*) FROM T_Lots_crit WHERE TLC_No_Etab_Naiss=etab_naiss AND TLC_No_Imm=no_immeuble AND TLC_No_Lot=no_lot;
     
    crits varchar2(30000);
    niu_courant P_DESG%ROWTYPE;
    NbEnreg integer;
     
    BEGIN
     
     FOR niu_courant IN GetCrit LOOP
       crits := TRIM(crits) || 'NIU' || To_char(niu_courant.DSG_NIU) || '=' || niu_courant.DSG_Valeur_descriptif || ';';
     END LOOP;
     
     OPEN existEnreg;
     LOOP
      FETCH existEnreg INTO NbEnreg;
       IF (NbEnreg=0) THEN
         INSERT INTO T_Lots_crit(TLC_No_Etab_Naiss,TLC_No_Imm,TLC_No_Lot,TLC_Crit) VALUES (etab_naiss,no_immeuble,no_lot,crits);
       ELSE
         UPDATE T_Lots_crit SET TLC_Crit=crits WHERE TLC_No_Etab_Naiss=etab_naiss AND TLC_No_Imm=no_immeuble AND TLC_No_Lot=no_lot;
       END IF; 
      EXIT WHEN existEnreg%NOTFOUND;
     END LOOP;
    END;
    /
    SET serverout ON
    show error
    La ligne 17 correspond a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    IF (NbEnreg=0) THEN
    Par contre du coup je me demande si mon insert ce fait ou pas? si je quitte lorsque je ne trouve de count(*)?

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 136
    Points : 112
    Points
    112
    Par défaut
    Ah ok j'avais pas fait attention à la manière dont tu utilisais ton curseur.

    Alors plusieurs remarques

    1. Pour parcourir un curseur, tu peux faire comme tu as fait, par contre pense à faire un close de ton curseur à la fin.

    2. Quand tu parcours un curseur avec une boucle for, c'est une ligne qui est retournée. Donc si tu veux accéder à un champ particulier (en l'occurence, ton count), il faut faire ligne.champ. Dans ton cas, tu aurais pu faire dans ta requête un "select count(*) as toto" puis tester "NbEnreg.toto=0"

    3. Mais en fait on s'en fout un peu de tout ça, je ne vois pas pourquoi tu fais une boucle puisque ton curseur ne retournera qu'une seule valeur!! Dans tous les cas tu passeras exactement une fois dans ta boucle. Donc pas besoin de curseur, écris simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT COUNT(*)
    INTO NbEnreg
    FROM T_Lots_crit
    WHERE TLC_No_Etab_Naiss=etab_naiss AND TLC_No_Imm=no_immeuble AND TLC_No_Lot=no_lot

  8. #8
    Membre expérimenté Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Points : 1 332
    Points
    1 332
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CURSOR existEnreg IS SELECT COUNT(*) FROM T_Lots_crit WHERE TLC_No_Etab_Naiss=etab_naiss AND TLC_No_Imm=no_immeuble AND TLC_No_Lot=no_lot;


    ici ce cursuer n'est pas nécessaire

    tu peux utiliser une variable a la place

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select count(*) into ma_var

    Citation Envoyé par locs
    Par contre du coup je me demande si mon insert ce fait ou pas? si je quitte lorsque je ne trouve de count(*)?
    tu as
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT);
    sinon il y a MERGE qui insert si n'existe pas
    et update ce qui existe (a partir de 9I)

    voir la doc officielle sur tahiti.oracle.com

    asktom.oracle.com tahiti.oracle.com otn.oracle.com

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.


    phrase chinoise issue du Huainanzi

  9. #9
    Membre du Club
    Inscrit en
    Juin 2004
    Messages
    178
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 178
    Points : 40
    Points
    40
    Par défaut
    Ok super ca marche impec, merci beaucoup.

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

Discussions similaires

  1. erreur procedure stockée oracle
    Par gg2vig dans le forum SAP Crystal Reports
    Réponses: 0
    Dernier message: 10/09/2007, 14h42
  2. Erreur dans procedure stockées
    Par freud dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/07/2007, 11h13
  3. Erreur 450 avec une procedure stockée : Access/VB6
    Par poissonsoluble dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 30/05/2007, 10h14
  4. Erreur creation procedure stockées (Firebird1.5+delphi 7)
    Par nassoft dans le forum Bases de données
    Réponses: 3
    Dernier message: 18/05/2007, 12h30
  5. Impossible de créer des procedures stockée ==> ERREUR 106
    Par JMS_PCO dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 27/02/2006, 17h33

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