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 :

Appel de fonction stockée


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Mars 2002
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 13
    Par défaut Appel de fonction stockée
    Bonjour.

    J'utilise Oracle 8i.

    Je début avec Oracle et j'ai besoin d'utiliser une fonction stockée. J'ai écrit la fonction suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    CREATE OR REPLACE  FUNCTION "KEPH"
    RETURN number 
    IS
      id_fam number;
    BEGIN
      EXECUTE IMMEDIATE 'INSERT INTO bug_family (id_test, description, id_owner, date_opening)
        VALUES (2, ''tes'', 2, SYSDATE)
        RETURNING id_family INTO :1' INTO id_fam;
      RETURN id_fam;
    END;
    Ensuite, j'appelle cette fonction avec SQL*Plus en tappant la commande suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select keph() from dual;
    Malheureusement, j'obtiens l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select keph() from dual
           *
    ERROR at line 1:
    ORA-01007: variable not in select list
    ORA-06512: at "MANG_ADMIN.KEPH", line 4
    ORA-06512: at line 1
    Je ne vois vraiment pas d'où peut provenir le problème. Le voyez-vous ?

    Merci d'avance.

    Keph

    PS : j'utilise cette fonction stockée pour récupérer l'id de l'enregistrement que je suis en train de créer. Je pourrais récupérer la valeur courante de la séquence qui génére cet id, mais je pourrai alors avoir des problèmes d'accès concurentiel. Je pense pouvoir contourner cette limitation avec la commande RETURNING INTO mais pour cela je dois faire une fonction stockée... C'est fou d'en faire autant pour si peu, non ?

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    1/ pourquoi encadrer le nom de votre procédure de guillemets
    2/ pour invoquer une procédure, on peut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    begin
      ma_proc; -- pas de parenthèse s'il n'y a pas d'arguments
    end;
    /
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    exec ma_proc; -- idem
    3/ votre idée ne répond pas à votre problématique initiale des accès concurrents.
    Pour gérer des identifiants unique, regardez dans la FAQ du côté des séquences ou faîtes une recherche avancée sur ce forum avec ce mot clé

  3. #3
    Membre habitué
    Inscrit en
    Mars 2002
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 13
    Par défaut
    Bonjour et merci pour votre réponse.

    1/ J'ai généré cette procedure avec Schema Manager qui ajoute automatiquement les guillemets en question.

    2/ Cela ne fonctionne pas mieux dans le cas présent.

    3/ J'utilise une séquence pour gérer les identifiants uniques, et des triggers pour les mettre automatiquement lors d'un INSERT (comme on le dit dans la FAQ). Seulement j'aimerais, lors d'un INSERT, récupérer l'identifiant de la ligne que je viens de créer.

  4. #4
    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
    Quand vous encadrez votre nom d'objet par des guillemets, il faut respecter la casse quand vous l'appelez par la suite. Néanmoins il est vivement déconseillé de procéder ainsi...

    De toutes façons vous ne pourrez pas appeler une fonction qui fait un insert dans un ordre select, sous peine d'obtenir l'erreur :
    ORA-14551: impossible d'effectuer une opération DML dans une interrogation

    Enfin, je ne comprends pas pourquoi vous utilisez execute immediate
    Pourquoi ne pas faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE OR REPLACE  FUNCTION KEPH
    RETURN number 
    IS
      id_fam number;
    BEGIN
      INSERT INTO bug_family (id_test, description, id_owner, date_opening)
      VALUES (2, 'tes', 2, SYSDATE)
      RETURNING id_family INTO id_fam;
      RETURN id_fam;
    END;
    /

  5. #5
    Membre habitué
    Inscrit en
    Mars 2002
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 13
    Par défaut
    C'est curieux, j'ai beau faire (après création de la fonction comme l'a indiqué plaineR) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    begin;
    keph();
    end;
    /
    ou encore :
    j'obtiens l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    call keph()
         *
    ERROR at line 1:
    ORA-06576: not a valid function or procedure name
    ou encore:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ERROR at line 2:
    ORA-06550: line 2, column 1:
    PLS-00221: 'KEPH' is not a procedure or is undefined
    ORA-06550: line 2, column 1:
    PL/SQL: Statement ignored
    Mais je pense que je dois mal m'y prendre. Vous pensez alors que faire une fonction stockée qui réalise un INSERT et qui renvoie l'identifiant est une mauvaise idée ?

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    mais vous liser TOUT ce que l'on écrit ?
    Pas de parenthèses et pas de mot clé CALL

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Appel Procédure/fonction stockée MySQL en VBScript
    Par forzalec dans le forum VBScript
    Réponses: 1
    Dernier message: 12/02/2014, 13h05
  2. Déclarer et appeller des fonctions "stockées"
    Par azerty25 dans le forum Entity Framework
    Réponses: 1
    Dernier message: 04/04/2012, 15h46
  3. [SQL-Server] Comment appeller une fonction stockée en MS SQLServer depuis PHP ?
    Par momoG dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 04/12/2008, 17h11
  4. Réponses: 1
    Dernier message: 28/09/2008, 10h14
  5. Réponses: 17
    Dernier message: 13/07/2006, 13h52

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