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-00904 invalid identifier pour un update


Sujet :

PL/SQL Oracle

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut ORA-00904 invalid identifier pour un update
    bonjour,
    J'ai un problème lors de l'execution d'un update depuis une procedure.
    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
     
    CREATE TABLE OUTPUT(
    ID varchar2(10),
    ACTION varchar2(20),
    TYPE varchar2(5),
    REQ_TYPE NUMBER,
    REQ_OBJ NUMBER,
    IMSI1 varchar2(50)
    );
     
    CREATE TABLE CONVERT(
    ACTION VARCHAR2(20),
    TYPE   VARCHAR2(5),
    SET_STMT VARCHAR2(4000)
    );
     
    insert into OUTPUT values ('x1','CRE_AUC','NT',NULL,NULL,'1234');
     
    insert into convert values ('CRE_AUC','NT','REQ_TYPE=1,REQ_OBJ=1,IMSI1=''60503'' || cur.IMSI1');
     
    CREATE OR REPLACE PROCEDURE CONVERTING_TEST 
    IS
        CURSOR tasks IS SELECT * FROM OUTPUT;
        set_expression varchar2(4000);
        sql_stmt varchar2(4000);
    BEGIN
     
        FOR cur IN tasks 
        LOOP
           SELECT SET_STMT
           INTO set_expression
           FROM CONVERT
           WHERE ACTION = cur.ACTION
           AND TYPE = cur.TYPE;
     
            sql_stmt:=  'UPDATE OUTPUT SET ' || set_expression || ' WHERE ID = '''
                    || cur.id
                    || ''' AND ACTION = '''
                    || cur.action
                    || '''';
     
            execute immediate sql_stmt;
     
        END LOOP;
     
     
       EXCEPTION
         WHEN NO_DATA_FOUND THEN
           NULL;
         WHEN OTHERS THEN
           -- Consider logging the error and then re-raise
           RAISE;
    END CONVERTING_TEST;
    /
    J'ai le message d'erreur : ORA-00904: "cur.IMSI1": invalid identifier

    Est ce que quelqu'un pourrait m'aider?
    Je bloquuuuue dessus

    Merci

  2. #2
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Ajouter un dbms_output.put_line dans votre procédure avant le execute immediate pour voir le instruction sql généré
    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
     
    Connected to Oracle Database 10g Express Edition Release 10.2.0.1.0 
    Connected as mni
     
    SQL> set serveroutput on
    SQL> 
    SQL> begin
      2    converting_test;
      3  end;
      4  /
     
    UPDATE OUTPUT SET REQ_TYPE=1,REQ_OBJ=1,IMSI1='60503' || cur.IMSI1 WHERE ID = 'x1' AND ACTION = 'CRE_AUC'
     
    begin
      converting_test;
    end;
     
    ORA-00904: "CUR"."IMSI1" : identificateur non valide
    ORA-06512: à "MNI.CONVERTING_TEST", ligne 34
    ORA-06512: à ligne 3
     
    SQL>
    De plus je n'aime pas trop votre gestion des anomalies

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
       EXCEPTION
         WHEN NO_DATA_FOUND THEN
           NULL;
         WHEN OTHERS THEN
           -- Consider logging the error and then re-raise
           RAISE;

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci mnitu pour ta réponse.
    Pour la gestion des erreurs, en fait, ce n'est pas la procédure que j'utilise vraiment. C'est un petit exemple pour spécifier mon problème.

    Vu que je ne suis pas admin sur la base, je n'ai pas les droits pour : SET serveroutput ON.

    mais j'ai mis qd meme le resultat dans une table et il est correct :
    UPDATE OUTPUT SET REQ_TYPE=1,REQ_OBJ=1,IMSI1='60503' || cur.IMSI1 WHERE ID = 'x1' AND ACTION = 'CRE_AUC'

    J'ai toujours l'erreur ORA-00904: "CUR"."IMSI1": invalid identifier

    Tu as une idée ? Merci

  4. #4
    Membre averti Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Points : 442
    Points
    442
    Par défaut
    Bonjour,

    Je ne pense pas qu'on ai besoin des droits d'admin pour faire un "SET serveroutput ON" : pour moi il s'agit d'un fonctionnalité du client Sql*Plus. Tu as un message d'erreur ?

    Sinon, l'ordre que tu obtient n'est pas correct :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE OUTPUT SET REQ_TYPE=1,REQ_OBJ=1,IMSI1='60503' || cur.IMSI1 WHERE ID = 'x1' AND ACTION = 'CRE_AUC'
    Il n'y a aucune table dans ta requête qui s'appelle "cur", donc "cur.IMSI1" ne peut pas être évalué.

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci xdescamp pour ta réponse.

    En fait, dans ma procédure (dans mon 1er post), j'ai un curseur cur :
    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
    FOR cur IN tasks 
        LOOP
           SELECT SET_STMT
           INTO set_expression
           FROM CONVERT
           WHERE ACTION = cur.ACTION
           AND TYPE = cur.TYPE;
     
            sql_stmt:=  'UPDATE OUTPUT SET ' || set_expression || ' WHERE ID = '''
                    || cur.id
                    || ''' AND ACTION = '''
                    || cur.action
                    || '''';
     
            execute immediate sql_stmt;

  6. #6
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Set serveroutput on c'est une commande sqlplus rien avoir avec le DBA.

    C'est quoi le ||cur.IMS1 dans ton cas? Testez la commande sous sqlplus.

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par mnitu Voir le message
    C'est quoi le ||cur.IMS1 dans ton cas? Testez la commande sous sqlplus.
    c'est un curseur sur la table OUTPUT.
    Avec sql plus, la commande marche.

    c'est un problème de visibilité, j'ai l'impression. Comme si le curseur n'est pas vu dans "set_expression"

  8. #8
    Membre averti Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Points : 442
    Points
    442
    Par défaut
    L'ordre que tu récupères ne peux pas fontionner sous Sql*Plus : "cur" n'existe pas. Si tu prends la requête d'UPDATE générée et que tu l'exécutes sous Sql*Plus, elle ne fonctionne pas.
    Et c'est ce qui est fait dans ton programme :
    - tu construis une chaine de caractères
    - puis cette chaine de caractères est exécutée seule, telle quelle, indépendamment (d'un point de vue de la syntaxe) du bloc PL/SQL dans lequel elle a été construite.

  9. #9
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par xdescamp Voir le message
    L'ordre que tu récupères ne peux pas fontionner sous Sql*Plus : "cur" n'existe pas. Si tu prends la requête d'UPDATE générée et que tu l'exécutes sous Sql*Plus, elle ne fonctionne pas.
    Et c'est ce qui est fait dans ton programme :
    - tu construis une chaine de caractères
    - puis cette chaine de caractères est exécutée seule, telle quelle, indépendamment (d'un point de vue de la syntaxe) du bloc PL/SQL dans lequel elle a été construite.
    Il n'y a donc pas un moyen de stocker l'expression SET dans une table?
    ça ne peut pas marcher par un autre moyen?

  10. #10
    Membre averti Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Points : 442
    Points
    442
    Par défaut
    Citation Envoyé par sassmine82 Voir le message
    Il n'y a donc pas un moyen de stocker l'expression SET dans une table?
    ça ne peut pas marcher par un autre moyen?
    Pas en faisant référence à un morceau du bloc PL/SQL.
    Éventuellement, tu peux utiliser une bind variable.
    Quelque chose du style :
    - tu stockes dans ta table non pas "cur.IMSI1" mais ":cur_imsi1" par ex.
    - pour exécuter tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    execute immediate sql_stmt using cur.IMSI1 ;
    ...

  11. #11
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Peut être que vous devez nous expliquer un peu ce que vous voulez faire. Certaines solutions sont recommandées dans certains cas et pas dans les autres …

Discussions similaires

  1. ORA-00904: invalid identifier
    Par DeveloppeurWeb dans le forum PL/SQL
    Réponses: 4
    Dernier message: 18/02/2013, 09h38
  2. ORA-00904: "Nom_Colonne": invalid identifier
    Par robinson50 dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 07/08/2008, 16h34
  3. Erreur ORA-00904 : invalid identifier
    Par Sabact dans le forum SQL
    Réponses: 10
    Dernier message: 16/04/2008, 15h07
  4. ORA-00904: invalid identifier sur le last query
    Par decksroy dans le forum Forms
    Réponses: 4
    Dernier message: 24/01/2008, 12h03
  5. Réponses: 4
    Dernier message: 25/01/2006, 18h25

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