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

Oracle Discussion :

Problème proc. stockée sous Oracle 8


Sujet :

Oracle

  1. #1
    Membre actif
    Inscrit en
    Novembre 2004
    Messages
    312
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 312
    Points : 202
    Points
    202
    Par défaut Problème proc. stockée sous Oracle 8
    Bonjour,

    J'ai le INSERT - SELECT suivant dans une proc. 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
     
    INSERT 
      INTO ENVELOPPE
    select distinct CODE_MARCHE_NATIONAL, 
                    MAPU.NUMERO_PERIODE, 
                    DATE_DEBUT_PERIODE, 
    		DATE_FIN_PERIODE, 
    		MAPU.NUMERO_LOT, 
    		MAPU.code_uag , 
                    MAPU.MT_MAX_UAG, 
                    MAPU.MT_MAX_UAG - (Select NVL(SUM(MONTANT_HT_EJ),0) TOTAL
                                       FROM EJ
                                       WHERE EJ.NUMERO_PERIODE =  MAPU.NUMERO_PERIODE
                                         AND EJ.NUMERO_LOT = MAPU.NUMERO_LOT 
                                         AND EJ.MARCHE = V_MARCHE.CODE_MARCHE_NATIONAL
                                         AND EJ.CODE_UAG = MAPU.code_uag)
    from MONTANT_AUTORISE_PAR_UAG MAPU,
        (select distinct id_marche,CODE_MARCHE_NATIONAL from marche
          where CODE_STATUT = 'N'
            and CODE_PRM <> '02') V_MARCHE,  PERIODE     
    WHERE MAPU.id_marche = V_MARCHE.id_marche
      AND MAPU.ID_PERIODE = PERIODE.ID_PERIODE;
    Cet INSERT fonctionne sous SQL*Plus mais me renvoie l'erreur suivante lorsque je compile la proc. stockée :

    Erreurs pour PROCEDURE P_TEST1 :

    LINE/COL ERROR
    -------- ----------------------------------------------------------------
    19/36 PLS-00103: Symbole "SELECT" rencontrÚ Ó la place d'un des
    symboles suivants :
    ( - + mod not null others <an identifier>
    <a double-quoted delimited-identifier> <a bind variable> avg
    count current exists max min prior sql stddev sum variance
    execute forall time timestamp interval date
    <a string literal with character set specification>
    <a number> <a single-quoted SQL string>

    25/1 PLS-00103: Symbole "FROM" rencontrÚ Ó la place d'un des symboles
    suivants :

    LINE/COL ERROR
    -------- ----------------------------------------------------------------
    ; return returning and or
    Auriez-vous une idée ?

    Merci.

  2. #2
    Membre régulier Avatar de Bahan
    Inscrit en
    Avril 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Avril 2006
    Messages : 147
    Points : 88
    Points
    88
    Par défaut
    La ligne 19 c'est laquelle ? ^_^
    Si tu pouvais nous mettre la procédure en entier.

    Merci.

    Bahan

  3. #3
    Membre actif
    Inscrit en
    Novembre 2004
    Messages
    312
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 312
    Points : 202
    Points
    202
    Par défaut
    Voici la proc. stockée en entier :

    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 p_test1( pVar_codret in out number, pOra_error in out varchar2 ) IS
     
    BEGIN
     
    INSERT 
      INTO ENVELOPPE
    select distinct CODE_MARCHE_NATIONAL, 
                    MAPU.NUMERO_PERIODE, 
                    DATE_DEBUT_PERIODE, 
    		DATE_FIN_PERIODE, 
    		MAPU.NUMERO_LOT, 
    		MAPU.code_uag , 
                    MAPU.MT_MAX_UAG, 
                    MAPU.MT_MAX_UAG - (Select NVL(SUM(MONTANT_HT_EJ),0) TOTAL
                                       FROM EJ
                                       WHERE EJ.NUMERO_PERIODE =  MAPU.NUMERO_PERIODE
                                         AND EJ.NUMERO_LOT = MAPU.NUMERO_LOT 
                                         AND EJ.MARCHE = V_MARCHE.CODE_MARCHE_NATIONAL
                                         AND EJ.CODE_UAG = MAPU.code_uag)
    from MONTANT_AUTORISE_PAR_UAG MAPU,
        (select distinct id_marche,CODE_MARCHE_NATIONAL from marche
          where CODE_STATUT = 'N'
            and CODE_PRM <> '02') V_MARCHE,  PERIODE     
    WHERE MAPU.id_marche = V_MARCHE.id_marche
      AND MAPU.ID_PERIODE = PERIODE.ID_PERIODE;
     
     
    END p_test1;
    /
    La ligne 19 correspond au SELECT après le ' - ' ( moins : signe négatif ).

  4. #4
    Membre régulier Avatar de Bahan
    Inscrit en
    Avril 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Avril 2006
    Messages : 147
    Points : 88
    Points
    88
    Par défaut
    Nous pourrions peut-être essayer ça.

    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
    CREATE OR REPLACE PROCEDURE p_test1
      (  pVar_codret IN OUT NUMBER
      ,  pOra_error IN OUT VARCHAR2)
    IS
      vRequete VARCHAR2(4000);
      vNomFonction VARCHAR2(50);
      vErrReq EXCEPTION;
    BEGIN
      vNomFonction := 'p_test1';
     
      vRequete := '
        INSERT INTO ENVELOPPE
        SELECT DISTINCT
          CODE_MARCHE_NATIONAL, 
          MAPU.NUMERO_PERIODE, 
          DATE_DEBUT_PERIODE, 
          DATE_FIN_PERIODE, 
          MAPU.NUMERO_LOT, 
          MAPU.code_uag, 
          MAPU.MT_MAX_UAG, 
          MAPU.MT_MAX_UAG - (
                SELECT NVL(SUM(MONTANT_HT_EJ),0) TOTAL
                FROM EJ
                WHERE EJ.NUMERO_PERIODE =  MAPU.NUMERO_PERIODE
                AND EJ.NUMERO_LOT = MAPU.NUMERO_LOT 
                AND EJ.MARCHE = V_MARCHE.CODE_MARCHE_NATIONAL
                AND EJ.CODE_UAG = MAPU.code_uag)
        FROM
          MONTANT_AUTORISE_PAR_UAG MAPU,
          (
            SELECT DISTINCT 
              id_marche,
              CODE_MARCHE_NATIONAL 
            FROM marche
            WHERE CODE_STATUT = ''N''
            AND CODE_PRM <> ''02''
          ) V_MARCHE,
          PERIODE
        WHERE MAPU.id_marche = V_MARCHE.id_marche
        AND MAPU.ID_PERIODE = PERIODE.ID_PERIODE
      ';
     
      EXECUTE IMMEDIATE vRequete;
    EXCEPTION
      WHEN vErrReq THEN
        DBMS_OUTPUT.put_line(vNomFonction||'\ERREUR dans la requête : '||vRequete);
      WHEN OTHERS THEN
        DBMS_OUTPUT.put_line(vNomFonction||'\ERREUR Oracle '||TO_NUMBER(SQLCODE)||' : '||SQLERRM);
    END p_test1;
    Je vois que tu mets un code retour dans tes paramètres, ne voudrais-tu pas dans ce cas utiliser une fonction plutôt qu'une procédure stockée ?

    Cdt.

    Bahan

  5. #5
    Membre actif
    Inscrit en
    Novembre 2004
    Messages
    312
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 312
    Points : 202
    Points
    202
    Par défaut
    Le code retour est pour les messages d'erreurs. Je n'ai pas mis toute la proc.

    Le problème vient de ce INSERT SELECT.

    Ce que je ne comprends pas, c'est pourquoi il passe sous SQL*Plus et pas dans une proc. stockée. ???

  6. #6
    Membre régulier Avatar de Bahan
    Inscrit en
    Avril 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Avril 2006
    Messages : 147
    Points : 88
    Points
    88
    Par défaut
    Là, cela ne passe toujours pas ?

    Vous avez essayé de la compiler (ça doit marcher ça ^_^) et de la lancer ?
    Pourriez-vous m'afficher le buffer de sortie ?

    Une autre question : quel front end utilisez-vous ? PL/SQL developper ? Toad ?

    Bahan

  7. #7
    Membre actif
    Inscrit en
    Novembre 2004
    Messages
    312
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 312
    Points : 202
    Points
    202
    Par défaut
    Je n'ai pas testé le EXECUTE IMMEDIATE mais j'imagine bien que cela va passer.
    Je souhaite plus essayer de comprendre pourquoi dans une procédure cet ordre INSERT - SELECT ne fonctionne pas !

  8. #8
    Membre régulier Avatar de Bahan
    Inscrit en
    Avril 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Avril 2006
    Messages : 147
    Points : 88
    Points
    88
    Par défaut
    Je pense que c'est tout simplement un problème de syntaxe.

    A moins d'utiliser un curseur (CURSOR ou FOR etc...) ou si le résultat ne renvoie qu'une seule ligne (SELECT gnagna INTO variable), on ne peut pas faire de SELECT comme ça dans du code PLSQL.

    Enfin, le must reste sinon la documentation Oracle (je pense) : PL/SQL User's Guide and Reference

    En tout cas, bon courage et bon appétit .

    Cdt.

    Bahan

  9. #9
    Membre habitué Avatar de Loyd1974
    Profil pro
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Points : 196
    Points
    196
    Par défaut
    J'ai extrapolé ton modèle de donnée et :

    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
     
    CREATE TABLE mapu
    (numero_periode NUMBER,
    date_debut_periode DATE,
    date_fin_periode DATE,
    numero_lot NUMBER,
    code_uag NUMBER,
    mt_max_uag NUMBER,
    id_marche NUMBER,
    id_periode NUMBER);
    > table créée
     
    CREATE TABLE EJ
    (montant_ht_ej NUMBER,
    numero_periode NUMBER,
    numero_lot NUMBER,
    marche NUMBER,
    code_uag NUMBER);
    > table créée 
     
    CREATE TABLE marche
    (id_marche NUMBER,
    code_marche_national NUMBER,
    code_statut VARCHAR2(1),
    code_prm VARCHAR2(2));
    > table créée
     
    CREATE TABLE enveloppe
    (code_marche_national NUMBER,
    numero_periode NUMBER,
    date_debut_periode DATE,
    date_fin_periode DATE,
    numero_lot NUMBER,
    code_uag NUMBER,
    mt_max_uag NUMBER,
    diff_mt NUMBER);
    > table créée 
     
    CREATE OR REPLACE PROCEDURE p_test1( pVar_codret IN out number, pOra_error IN out varchar2 ) IS
     
    BEGIN
     INSERT 
      INTO ENVELOPPE
    SELECT DISTINCT CODE_MARCHE_NATIONAL, 
                    MAPU.NUMERO_PERIODE, 
                    DATE_DEBUT_PERIODE, 
            DATE_FIN_PERIODE, 
            MAPU.NUMERO_LOT, 
            MAPU.code_uag , 
                    MAPU.MT_MAX_UAG, 
                    MAPU.MT_MAX_UAG - (SELECT NVL(SUM(MONTANT_HT_EJ),0) TOTAL
                                       FROM EJ
                                       WHERE EJ.NUMERO_PERIODE =  MAPU.NUMERO_PERIODE
                                         AND EJ.NUMERO_LOT = MAPU.NUMERO_LOT 
                                         AND EJ.MARCHE = V_MARCHE.CODE_MARCHE_NATIONAL
                                         AND EJ.CODE_UAG = MAPU.code_uag)
    FROM MAPU,
        (SELECT DISTINCT id_marche,CODE_MARCHE_NATIONAL FROM marche
          WHERE CODE_STATUT = 'N'
            AND CODE_PRM <> '02') V_MARCHE,  PERIODE     
    WHERE MAPU.id_marche = V_MARCHE.id_marche
      AND MAPU.ID_PERIODE = PERIODE.ID_PERIODE;
    END p_test1;
    > procédure créée
    donc en 10g, ca marche
    t'as pas fait une erreur typographique par hasard ? (virgule en trop ou en moins par exemple)

  10. #10
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    est-ce que la requête suivante marche en Oracle 8?

    Je crois que ça été introduit en 8i

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select 1 - (select 2 from dual) from dual
    si ça plante, alors if faut enlever ta sous-requête de la clause SELECT et la mettre dans la clause FROM

  11. #11
    Membre actif
    Inscrit en
    Novembre 2004
    Messages
    312
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 312
    Points : 202
    Points
    202
    Par défaut
    Je suis bien en 8i, mais je vais essayer quand même ta proposition.

    Merci beaucoup !

Discussions similaires

  1. [MySQL] Problème Proc Stockée, s'éxecute sous PhpMyAdmin mais pas avec PHP
    Par toham dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 07/02/2012, 16h55
  2. Problème de requête sous Oracle
    Par tukutt dans le forum SGBD
    Réponses: 1
    Dernier message: 23/05/2008, 09h37
  3. Problème avec NVL sous ORACLE
    Par tchoimars dans le forum SQL
    Réponses: 4
    Dernier message: 21/05/2007, 16h35
  4. Réponses: 9
    Dernier message: 23/09/2006, 17h13
  5. Réponses: 2
    Dernier message: 29/03/2006, 09h38

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