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

SQL Oracle Discussion :

[SQL Dynamique] Problème d'exécution d'une requete d'update dans une fonction


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Juin 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2004
    Messages : 21
    Par défaut [SQL Dynamique] Problème d'exécution d'une requete d'update dans une fonction
    Bonjour,
    Je suis sur Oracle 9i et je développe une application pour les cours et je suis bloqué sur un points non vu.
    On doit faire un logiciel PHP/Oracle, si j'ai bien compris, la seule façon de "parler" avec le PHP c'est les fonctions. Me voilà parti à en exécuter une
    Voilà mon problème :
    J'ai créé une fontion qui va renvoyer 1 ou 0, jusque là aucun problème.
    Mais dans ma fonction, je me suis rendu compte que je pouvais faire de la maintenant en modifiant la base profitant de mes tests.

    Bref je fais tous plein de tests pour savoir si je vais renvoyer 1 ou 0, je fais mes select avec INTO ça marche très bien. Je veux faire un update.
    J'ai vérifié, ma requete marche très bien en test en direct donc elle est bonne.
    J'ai vérifié dans une procédure pour profiter du dbms_output, elle est toujours bonne. Donc le problème ne vient pas de la requete. hors j'ai l'erreur :
    impossible d'effectuer une opération DML dans une interrogation

    Je me suis dit, OK on va procéder autrement par un execute immediate.
    J'ai envoyé la requete dans une variable et j'ai evoyé un execute immediate :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ligne_commande:={mon update...je vous épargne la taille de la ligne};
    execute immediate ligne_commande;
    Hors j'obtiens l'erreur ORA-00911: Caractère non valide
    Pile sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    execute immediate ligne_commande;
    Voilà, ayant repris le code d'une des question résolue ici, je comprend vraiment pas ce qui ne va pas. Que ce soit dans une solution comme dans l'autre.

    En vous remerciant d'avance.

  2. #2
    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
    le problème étant que tu nous épargnes la commande exécutée, j'vois mal comment on pourrait t'aider... en plus, pour du débuggage, je pense que tu sauras te débrouiller seul en affichant le contenu de ligne_commande et en le copiant sans SQL*Plus

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Peut-être qu'il suffit juste de supprimer le ';' final: il est nécessaire dans SQL*Plus mais il ne faut pas l'utiliser avec EXECUTE IMMEDIATE.

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Juin 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2004
    Messages : 21
    Par défaut
    Ok vous l'aurez voulu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ligne_commande:='UPDATE journee SET hfin_matin_jour=to_timestamp(''' || to_char(heure_depointage,'DD/MM/YY HH24:MI:SS') || ''',''DD/MM/YY HH24:MI:SS'') WHERE to_char(date_jour,''DD/MM/YY'')=''' || to_char(temps,'DD/MM/YY') || ''' AND rf_id_pers=' || pers;
     
    execute immediate ligne_commande;
    Voilà la ligne commande qui est exécutée, sinon pour l'histoire du ';' c'est pas ça, j'ai tenté sans le ';' c'est la même chose.
    Et pour le contenu de la ligne, tout est correct.

  5. #5
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    Salut à tous,
    pour autant que je sache, il n'est pas possible avec Oracle de faire du DML (insert - update - delete) dans une FONCTION. Laquelle ne peut être invoquée que depuis un Select ou une assignation de valeur à une variable, ou encore un test de valeur de variable.

    avec Oracle il faut faire une PROCEDURE qui retourne un paramètre OUT.

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Juin 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2004
    Messages : 21
    Par défaut
    OK, peut-on, appeler une procédure à partir d'une fonction?Si oui comment, ça serait une feinte pour mon problème...

  7. #7
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Citation Envoyé par Yorglaa
    pour autant que je sache, il n'est pas possible avec Oracle de faire du DML (insert - update - delete) dans une FONCTION. Laquelle ne peut être invoquée que depuis un Select ou une assignation de valeur à une variable, ou encore un test de valeur de variable.
    Bonjour Yorglaa,
    Je me permets de modérer tes propos , il est tout à fait possible de faire du DML sous Oracle ... en PL/SQL. Par contre il n'est pas possible d'utiliser cette fonction dans un ordre DML :
    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
    SQL> create table t (a number);
    Table created.
     
    SQL> create or replace function f return number is
      2  begin
      3    insert into t values (1);
      4    return 1;
      5  end;
      6  /
    Function created.
     
    SQL> declare
      2    a number;
      3  begin
      4    a := f;
      5  end;
      6  /
    PL/SQL procedure successfully completed.
     
    SQL> select * from t;
            A
    ---------
            1
     
    SQL> select f from dual;
    select f from dual
           *
    ERROR at line 1:
    ORA-14551: cannot perform a DML operation inside a query
    ORA-06512: at "COMPTA.F", line 3
    ORA-06512: at line 1

Discussions similaires

  1. Réponses: 3
    Dernier message: 23/01/2012, 14h50
  2. Réponses: 1
    Dernier message: 26/12/2010, 21h20
  3. Réponses: 9
    Dernier message: 26/11/2008, 10h18
  4. Réponses: 2
    Dernier message: 18/04/2008, 11h41
  5. insertion dans une table puis update dans une autre table
    Par uptoditime dans le forum VBA Access
    Réponses: 5
    Dernier message: 10/10/2007, 18h08

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