La résolution “Ne peut pas effectuer DML à l'intérieur d'une requête” erreur dans Oracle
J'ai créé fonction régulière. Il a été créé avec succès. Mais quand je le lance avec
select reg('awlad','01968688680','545466455','12345') from dual
Il me donne cette erreur:
ORA-14551: cannot perform a DML operation inside a query
Comment puis-je résoudre ce problème?
CREATE OR REPLACE FUNCTION reg(
name in varchar2,
cellNo in varchar2,
voterId in varchar2,
pass in varchar2
)
RETURN NUMBER
IS
succ NUMBER;
BEGIN
succ:=0;
insert into logInfo values(loginfo_seq.nextval,cellNo,pass,0);
succ:=1;
insert into passInfo values(name,cellNo,voterId);
succ:=2;
RETURN succ;
END;
Vous devez vous connecter pour publier un commentaire.
Une fonction est censé calculer et retourner un résultat, pas de changement de l'état de la base de données. Si vous voulez faire
DML
dans une fonction (par exemple, si vous souhaitez insérer des lignes dans les tables), vous ne pouvez pas appeler cette fonction dans unSELECT
déclaration depuis unSELECT
instruction ne peut pas changer l'état de la base de données. En général, vous seriez mieux de la création de ce genre de chose comme une procédure stockée plutôt que d'une fonction stockée.Vous pouvez appeler cette fonction à partir d'un PL/SQL bloc comme vous le feriez pour appeler une procédure stockée
Si vous souhaitez créer une procédure à cette
puis vous auriez besoin d'appeler la procédure en passant par la
OUT
paramètreOUT
paramètre. Édité ma réponse à montrer comment le faire.Si tout ce que vous voulez faire est de les informations du journal, il serait approprié d'utiliser un autonome transaction pour faire de la plaquette intermédiaire.
Noter qu'il sera utile pour le débogage but, mais comme il n'est pas transactionnel, il ne devrait pas être utilisé pour enregistrer les données (depuis les lignes insérées va rester, même si la transaction est annulée).