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 :

ORA-00926: missing VALUES key


Sujet :

PL/SQL Oracle

  1. #1
    Membre à l'essai
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Avril 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2011
    Messages : 5
    Par défaut ORA-00926: missing VALUES key
    Bonjour tout le monde,

    Je suis confronté a un petit problème à la compilation d'une procedure avec SQL*Plus.

    Voila ci-dessous la procédure avec les deux erreurs :

    Code sql : 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
    SQL> edit
    Wrote file afiedt.buf
     
      1  CREATE OR REPLACE PROCEDURE Y_INC_SAS_ENT(NUMCMD IN NUMBER)
      2  AS
      3  BEGIN
      4  INSERT INTO satcd (nuisatcd, etssatcd,clasatcd, numsatcd, snusatcd, fousatcd, mnesatcd, refsatc
      5  devsatcd, depsatcd, refsatcd, devsatcd, depsatcd, dcdsatcd, drdsatcd,lansatcd,etasatcd,
      6  extsatcd,obssatcd, ucrsatcd);
      7  SELECT nuisvcdv, substr(clisvcdv,0,3),'HPML', numsvcdv, snusvcdv, etssvcdv,'BL'||expsvcdv,
      8  clasvcdv||numsvcdv||snusvcdv, devsvcdv, refsvcli, dcdsvcdv, dedsvcdv,'FR','A',nuisvcdv,obssvcdv
      9  FROM svcdv, svcli
     10  where nuisvcdv = NUMCMD and clisvcdv = numsvcli and etssvcli = etssvcdv;
     11* END;
    SQL> /
     
    Warning: Procedure created with compilation errors.
     
    SQL> show error
    Errors for PROCEDURE Y_INC_SAS_ENT:
     
    LINE/COL ERROR
    -------- -----------------------------------------------------------------
    4/1      PL/SQL: SQL Statement ignored
    6/29     PL/SQL: ORA-00926: missing VALUES keyword
    SQL>

    Je vous remercie d'avance pour l'aide que vous allez pouvoir m'apporter.

    Anis

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    bonjour,

    dégagez le ";" avant le "SELECT" et mettez des parenthèses autour de votre "SELECT".

    Et pendant que vous y êtes, utilisez des inner join pour vos jointures

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    INSERT INTO satcd (nuisatcd, etssatcd,clasatcd, numsatcd, snusatcd, fousatcd, mnesatcd, refsatc
    devsatcd, depsatcd, refsatcd, devsatcd, depsatcd, dcdsatcd, drdsatcd,lansatcd,etasatcd,
    extsatcd,obssatcd, ucrsatcd)
    (SELECT nuisvcdv, substr(clisvcdv,0,3),'HPML', numsvcdv, snusvcdv, etssvcdv,'BL'||expsvcdv,
    clasvcdv||numsvcdv||snusvcdv, devsvcdv, refsvcli, dcdsvcdv, dedsvcdv,'FR','A',nuisvcdv,obssvcdv
    FROM svcdv 
    INNER JOIN svcli on clisvcdv = numsvcli and etssvcli = etssvcdv
    where nuisvcdv = NUMCMD);

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Les parenthèses autour du select sont facultatives !
    Une bonne mise en page suffit en général.

    Utilisez également des alias de tables pour faciliter la relecture.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Avril 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2011
    Messages : 5
    Par défaut
    j'ai bien enlever le ";" et et toujours ne fonctionne pas.
    Après plusieurs test j'ai trouver que le nombre des champs dans l' INSERT et plus grand que dans la SELECT

    Voila ca fonctionne comme ça!

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE OR REPLACE PROCEDURE Y_INC_SAS_ENT(NUMCMD IN NUMBER)
    AS
    BEGIN
    INSERT INTO satcd( nuisatcd, etssatcd,clasatcd, numsatcd, snusatcd, fousatcd, mnesatcd,
    refsatcd,devsatcd, depsatcd, dcdsatcd, drdsatcd,lansatcd,etasatcd,extsatcd,obssatcd, ucrsatcd) 
    SELECT nuisvcdv, substr(clisvcdv,0,3),'HPML', numsvcdv, snusvcdv, etssvcdv,'BL'||expsvcdv,
    clasvcdv||numsvcdv||snusvcdv, devsvcdv, refsvcli, dcdsvcdv, dedsvcdv,'FR','A',
    nuisvcdv,obssvcdv,ucrsvcdv
    FROM svcdv, svcli
    where nuisvcdv = NUMCMD and clisvcdv = numsvcli and etssvcli = etssvcdv ;
    END;
    /

    Merci.

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    J'espère juste que ce n'est pas pour un de vos clients, un peu de mise en page ne prend que deux minutes à réaliser et c'est tellement plus lisible et maintenable :
    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
    create or replace procedure y_inc_sas_ent
    (
      p$_numcmd in number
    )
    as
    begin
      insert into <schema>.satcd
      (
        nuisatcd, etssatcd, clasatcd, numsatcd, snusatcd, fousatcd,
        mnesatcd, refsatcd, devsatcd, depsatcd, dcdsatcd, drdsatcd,
        lansatcd, etasatcd, extsatcd, obssatcd, ucrsatcd
      ) 
      select ???.nuisvcdv                                 as nuisatcd
           , substr(???.clisvcdv, 1, 3)                   as etssatcd
           , 'HPML'                                       as clasatcd
           , ???.numsvcdv                                 as numsatcd
           , ???.snusvcdv                                 as snusatcd
           , ???.etssvcdv                                 as fousatcd
           , 'BL' || ???.expsvcdv                         as mnesatcd
           , ???.clasvcdv || ???.numsvcdv || ???.snusvcdv as refsatcd
           , ???.devsvcdv                                 as devsatcd
           , ???.refsvcli                                 as depsatcd
           , ???.dcdsvcdv                                 as dcdsatcd
           , ???.dedsvcdv                                 as drdsatcd
           , 'FR'                                         as lansatcd
           , 'A'                                          as etasatcd
           , ???.nuisvcdv                                 as extsatcd
           , ???.obssvcdv                                 as obssatcd
           , ???.ucrsvcdv                                 as ucrsatcd
        from <schema>.svcdv cdv
             inner join <schema>.svcli cli
               on cli.numsvcli = cdv.clisvcdv
              and cli.etssvcli = cdv.etssvcdv 
       where cdv.nuisvcdv = p$_numcmd;
    end;
    /

  6. #6
    Membre à l'essai
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Avril 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2011
    Messages : 5
    Par défaut
    bonjour,
    j'ai besoin d'ajouter UPDATE OR INSERT si l enregistrement déjà existant je dois faire Update sinon INSERT, a la compilation j'ai l'erreur suivante :
    7/3 PL/SQL: SQL Statement ignored
    7/10 PL/SQL: ORA-00903: invalid table name
    si je supprime "UPDATE OR" la procédure ça compile bien.

    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
    CREATE OR REPLACE procedure y_inc_sas_ent
    (
      NUMCMD IN number
    )
    AS
    begin
      UPDATE OR INSERT INTO satcd
      (
        nuisatcd, etssatcd, clasatcd, fousatcd, mnesatcd, 
        refsatcd, devsatcd, depsatcd, dcdsatcd, drdsatcd,
        lansatcd, etasatcd, extsatcd, obssatcd, ucrsatcd
      ) 
     
      SELECT cdv.nuisvcdv                                 AS nuisatcd
           , substr(cdv.clisvcdv, 1, 3)                   AS etssatcd
           , case when movsvlcv = 'RVS' then'HPRM' 
                  else 'HPML' end  			      AS clasatcd
           , cdv.etssvcdv                                 AS fousatcd
           , 'BL' || cdv.expsvcdv                         AS mnesatcd
           , cdv.clasvcdv || cdv.numsvcdv || cdv.snusvcdv AS refsatcd
           , cdv.devsvcdv                                 AS devsatcd
           , cli.refsvcli                                 AS depsatcd
           , cdv.dcdsvcdv                                 AS dcdsatcd
           , cdv.dedsvcdv                                 AS drdsatcd
           , 'FR'                                         AS lansatcd
           , 'A'                                          AS etasatcd
           , cdv.nuisvcdv                                 AS extsatcd
           , cdv.obssvcdv                                 AS obssatcd
           , cdv.ucrsvcdv                                 AS ucrsatcd
        FROM svcdv cdv
             INNER JOIN svcli cli
               ON cli.numsvcli = cdv.clisvcdv
              AND cli.etssvcli = cdv.etssvcdv
    	 INNER JOIN svlcv svl
    	  ON svl.nuisvlcv = cdv.nuisvcdv 
       WHERE cdv.nuisvcdv = NUMCMD;
    end;
    /
    merci de votre aide.

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    UPDATE OR INSERT, ça n'existe pas en SQL.
    Par contre, vous avez l'instruction MERGE qui réalise cela.

    Une petite recherche sur ce forum vous donnera de nombreux exemples !

  8. #8
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    UPDATE OR INSERT INTO

    On veut bien donner un coup de main mais il y a tout de même un minimum de recherche à faire

  9. #9
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Waldar Voir le message
    J'espère juste que ce n'est pas pour un de vos clients, un peu de mise en page ne prend que deux minutes à réaliser et c'est tellement plus lisible et maintenable :
    Tout est une question de goût.. je préfère un code plus compact qu'un insert qui me prend tout l'écran.. et encore dans l'exemple il n'y a que 15 colonnes qu'est ce que ce serait pour une centaine.

  10. #10
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 461
    Par défaut
    Citation Envoyé par McM Voir le message
    Tout est une question de goût.. je préfère un code plus compact qu'un insert qui me prend tout l'écran..
    Je crois qu'il est incontestable que l'indentation est une aide considérable à la lecture et à la compréhension de la structure.
    Par contre je ne suis pas fervent des retours à la ligne intempestifs (chaque colonne du SELECT sur une ligne, les parenthèses sur une ligne, etc), car ça dilue le code sans le rendre spécialement plus lisible, alors que la "compacité verticale" me facilite beaucoup la vie.

    Mais bien entendu, je préfère un code trop dilué qu'écrit au km. Il faut juste avoir un éditeur un peu intelligent, qui permette de replier les portions de code.
    Notepad++ est un début dans ce sens, mais pas très au point quand même.
    (Faudra qu'on se fasse un sondage sur les outils de ce genre, tiens...)

  11. #11
    Invité
    Invité(e)
    Par défaut
    Si le code est déjà indenté, c'est déjà fort bien et j'avoue que je n'irais pas imposé ma méthode à tout prix...
    Quand je vois le temps que je perds sur du code non indenté, non commenté, non historisé, je place mon combat ailleurs. (Surtout quand c'est ton boss qui l'a produit en mode geek il y a un certain temps !!!)

  12. #12
    Membre à l'essai
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Avril 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2011
    Messages : 5
    Par défaut Probléme de Case when
    Bonjour,
    Lorsque j'ajoute l'instruction case when dans la procédure elle ne fonctionne plus. merci de m'aider pour trouver une solution pour ajouter des conditions dans la procédure:
    si le champs movsvlcv = RVS alors clasatcd = 'HPRM' sinon clasatcd = 'HPML'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    , case when movsvlcv = 'RVS' then'HPRM' 
                  else 'HPML' end  			      AS clasatcd
    merci de votre aide.

  13. #13
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Case n'existe pas avant Oracle 9 (qui est assez vieux en fait ), utilisee decode à sa place.

  14. #14
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par McM Voir le message
    Tout est une question de goût.. je préfère un code plus compact qu'un insert qui me prend tout l'écran.. et encore dans l'exemple il n'y a que 15 colonnes qu'est ce que ce serait pour une centaine.
    Encore un fan de ce précept :
    http://thc.org/root/phun/unmaintain.html

    Après, on comprend mieuxp pourquoi y'avait un ";" qui traînait au milieu et pas assez de champs dans le SELECT.

    Je suis étonné de ne pas avoir vu un * se balader d'ailleurs

Discussions similaires

  1. ORA-00926: mot-clé VALUES absent lors de l'insertion avec tOracleOutPut
    Par hikamovic dans le forum Développement de jobs
    Réponses: 5
    Dernier message: 19/02/2015, 16h27
  2. ORA-00905 - missing key word
    Par jby43 dans le forum SQL
    Réponses: 2
    Dernier message: 04/09/2014, 14h24
  3. SQLException: ORA-00936: missing expression
    Par punisher999 dans le forum JDBC
    Réponses: 1
    Dernier message: 19/09/2008, 21h42
  4. Réponses: 5
    Dernier message: 07/08/2007, 12h20
  5. Réponses: 7
    Dernier message: 17/10/2006, 13h55

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