Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/01/2011, 20h43   #1
Invité de passage
 
log emi
Inscription : mai 2010
Messages : 1
Détails du profil
Informations personnelles :
Nom : log emi

Informations forums :
Inscription : mai 2010
Messages : 1
Points : 0
Points : 0
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 :
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 :
SELECT Suppression(2) FROM dual;
Mais oracle m'affiche une erreur :
Citation:
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.
theemilog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2011, 23h47   #2
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Tu t'y prends mal, il suffit de créer une procédure qui supprime la ligne :
Code :
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 :
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 :
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 :
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
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h00.


 
 
 
 
Partenaires

Hébergement Web