Une procédure ne renvoie pas de valeur. Une fonction renvoie une valeur, mais vous ne devez pas faire de DML dans une fonction (sinon vous ne pouvez pas faire référence à la fonction dans une instruction SQL, vous confondez les autorisations car normalement les DBA veulent pouvoir accorder un accès en lecture seule aux utilisateurs à toutes les fonctions pour que les utilisateurs effectuent des calculs de manière cohérente, etc.).
Vous pouvez ajouter un paramètre OUT à la procédure pour renvoyer l'état. Si le « succès » signifie qu'un ou plusieurs lignes ont été mises à jour, vous pouvez utiliser SQL% ROWCOUNT pour obtenir un décompte du nombre de lignes modifiées par l'instruction SQL avant et l'utiliser pour remplir le paramètre de retour, à savoir
CREATE OR REPLACE PROCEDURE test_proc (
p_iKey IN VARCHAR2,
p_retVal OUT INTEGER
)
AS
BEGIN
DELETE FROM myTable
WHERE theKey = p_iKey;
IF(SQL%ROWCOUNT >= 1)
THEN
p_retVal := 1;
ELSE
p_retVal := 0;
END IF;
END test_proc;
Bien sûr, d'un point de vue général de la clarté du code, je suis douteux à propos des paramètres OUT qui semblent essayer de retourner un code d'état. Vous êtes généralement mieux servi en supposant le succès et en lançant des exceptions en cas d'erreur.
ORA-14551: impossible d'effectuer une opération DML dans une requête – Benoit
@Benoit tel qu'il devrait être, la fonction est destinée à être invoquée à partir de PL/SQL non SQL – stjohnroe