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 :

Appel à une fonction de suppression


Sujet :

PL/SQL Oracle

  1. #1
    Candidat au Club
    Inscrit en
    Mai 2010
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 1
    Points : 3
    Points
    3
    Par défaut Appel à une fonction de suppression
    Bonsoir tous,

    J'ai écrit une fonction sous oracle qui permet de supprimer un chercheur à partir de son numéro, en voici le code :
    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
    create or replace FUNCTION Suppression(num in number)  return varchar
    IS
    c_table chercheur%rowtype; 
    cursor cr is select numCh from chercheur; 
    c_rec cr%rowtype; 
    i binary_integer;
    inexistant EXCEPTION; 
    BEGIN
    i := 1;
    for c_rec in cr loop 
    if(c_rec.numch=num) then
     delete from chercheur where c_rec.numch = num;
    return('Le chercheur a été supprimé');
    else
    i:=i+1;
    exit when cr%notfound;
    end if; end loop;
    if(i<2) then RAISE inexistant;
    else
    i := i-1;
    end if;
    EXCEPTION WHEN inexistant THEN
    return('Le chercheur nexiste pas');
    END;
    /
    le problème qui se pose est comment exécuter cette fonction
    j'ai essayé la commande suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select Suppression(2) from dual;
    Mais oracle m'affiche une erreur :
    ERREUR à la ligne 1 :
    ORA-14551: impossible d'effectuer une opération DML dans une interrogation
    ORA-06512: à "SGBD.SUPPRESSION", ligne 12
    Quelqu'un peut-il m'aider s'il-vous-plaît ?

    Merci.

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Tu t'y prends mal, il suffit de créer une procédure qui supprime la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    create or replace procedure suppression (p_num number) as 
    begin
      delete from chercheur where num = p_num;
    end;
    /
    Que tu appelles comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    begin suppression(x); end;
    Si tu as besoin de renvoyer une erreur si aucun chercheur ne sera supprimé alors tu peux générer l'erreur via un select puis catcher l'exception no_data_found, puis renvoyer une application_error avec un message personnalisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    create or replace procedure suppression2 (p_num number) as 
      chercheur_exists integer;
    begin
      select 1 into chercheur_exists from chercheur where num = p_num;
      delete from chercheur where num = p_num;
    exception when no_data_found then
      raise_application_error (-20001,'chercheur innexistant');
    end;
    /
    Le code d'erreur personnalisée doit être compris entre -20000 et -20999
    http://sheikyerbouti.developpez.com/...age=Chap1#L1.3

    Tu peux aussi définir une erreur personnalisée, comme tu l'as fait, mais comme tu dois d'abord générer une réelle erreur avant de pouvoir la raise (ou compter les lignes qui correspondent aux p_num ce qui peut être moins performant), je ne pense pas que ce soit pertinent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    create or replace procedure suppression3 (p_num number) as 
      chercheur_exists integer;
      inexistant EXCEPTION;
    begin
      begin
        select 1 into chercheur_exists from chercheur where num = p_num;
      exception when no_data_found then
        raise inexistant;
      end;
      delete from chercheur where num = p_num;
    exception when inexistant then
      raise_application_error (-20001,'chercheur innexistant');
    end;
    /
    Si les utilisateurs suppriment un chercheur via une IHM, peu de risque qu'ils suppriment un chercheur qui n'existe pas, donc personnellement je préférerais ne catcher aucune erreur, de toute façon si le chercheur n'existe pas il n'est pas supprimé (logique) et surtout pas besoin de selectionner à chaque fois le chercheur avant de le supprimer.
    De toute façon si une autre erreur est renvoyée elle sera transmise.

    [EDIT] au fait j'a considéré que num était unique (PK ou UK) sinon tu risques de tomber dans une exception TOO_MANY_ROWS au quel cas utilise rownum=1

Discussions similaires

  1. appeler une fonction connaissant son nom (en string)
    Par Guigui_ dans le forum Général Python
    Réponses: 1
    Dernier message: 20/07/2004, 00h46
  2. [DLL] problème pour appeler une fonction d'une DLL
    Par bigboomshakala dans le forum MFC
    Réponses: 34
    Dernier message: 19/07/2004, 11h30
  3. Appeler une fonction avec "action" ds un
    Par drinkmilk dans le forum ASP
    Réponses: 4
    Dernier message: 20/04/2004, 14h54
  4. [JSP] Appeler une fonction
    Par Patrick95 dans le forum Servlets/JSP
    Réponses: 10
    Dernier message: 23/12/2003, 13h44
  5. Appeler une fonction avec/sans parenthèses
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 29/12/2002, 18h48

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