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 :

Problème de fonction


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut Problème de fonction
    Bonjour à tous.

    J'ai un problème d'appel de fonction sur un utilisateur variable.
    le problème est issu d'un projet conséquent mais se résume à ceci

    plusieurs utilisateurs ont défini la fonction suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    create or replace function reg(id varchar2) return integer IS
    begin
     insert into testrc (id) values ('''||id||''');
     return 1;
    end;
    moi, je doit créer une procedure equivalente à unUser.reg(USER);
    j'ai essayé ceci, mais ca ne fonctionne pas, je reçois un "ORA-00900: invalid SQL statement"
    Code : 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 enregistrer(unUser varchar2) IS
      moi varchar2(50);
      n integer;
      ordre varchar2(100);
    BEGIN
      select USER into moi from dual;
      execute immediate unUser||'.reg('''||moi||''')' into n;
    --ou
      execute immediate 'n:= '||unUser||'.reg('''||moi||''')';
     
      dbms_output.put_line(n);
    END;
    par ailleur, le code suivant plante aussi, mais a cause de "can't do DML order in select"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    execute immediate 'select '||unUser||'.reg('''||moi||''') from dual' into n;
    si je fait simplement n:=user1.reg('usermoi'); ca fonctionne, mais ca n'est pas la procédure souhaitée

    Je parie que la solution est simple, mais je ne la trouve pas.

    EDIT:
    Comme prédit la solution est "simple": il suffit de faire une transaction autonome
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    create or replace function reg(id varchar2) return integer IS
    pragma autonomous_transaction;
    begin
     insert into testrc (id) values ('''||id||''');
     commit;
     return 1;
    end;
    cependant, s'il existe une solution ne demandant pas de modifier reg, ca serait mieux. (en principe, ce n'est pas à moi d'écrire reg)

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

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

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

    C'est une instruction PL/SQL qui doit être exécutée dans l'ordre dynamique, quelque chose dans la style (je n'ai pas vérifié la syntaxe exacte ):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE OR REPLACE PROCEDURE enregistrer(unUser varchar2) IS
      moi varchar2(50);
      n integer;
      ordre varchar2(100);
    BEGIN
      SELECT USER INTO moi FROM dual;
      execute immediate 'Begin :n:= '||unUser||'.reg('''||moi||'''); End;' Using Out n;
     
      dbms_output.put_line(n);
    END;

  3. #3
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Apparement, ce genre de code ne fonctionne pas non plus sous sqlplus (pour oracle 10g)

    La solution que nous avons finalement adopté est la transaction autonome
    et comme la soutenance du projet est demain matin, on a décidé qu'une solution qui fonctionne suffira...

Discussions similaires

  1. C++ Problème de fonctions et pointeurs
    Par zmatz dans le forum C++
    Réponses: 3
    Dernier message: 01/10/2005, 16h20
  2. [MFC][WINSOCK] Problème avec fonction recv
    Par Le Farfadet dans le forum MFC
    Réponses: 4
    Dernier message: 23/09/2005, 11h00
  3. Problème de fonction
    Par Anduriel dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 26/05/2005, 20h30
  4. Problème avec fonction d'envoie de mail
    Par zyg dans le forum Réseau/Web
    Réponses: 1
    Dernier message: 23/02/2005, 08h48
  5. [Requête] Problème avec fonction "DATE_FORMAT()"
    Par sekiryou dans le forum Requêtes
    Réponses: 4
    Dernier message: 11/01/2005, 21h52

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