Fonction de mise à jour dans PostgreSQL
-
08-07-2019 - |
Question
J'ai une question concernant une fonction de mise à jour que j'ai créée ...
CREATE OR REPLACE FUNCTION rm_category_update(icompany bpchar, iraw_mat_cat_code bpchar, iraw_mat_cat_desc bpchar)
RETURNS character AS
$BODY$
DECLARE
loc_result CHAR(50);
BEGIN
UPDATE rm_category
SET
raw_mat_cat_code = iraw_mat_cat_code,
raw_mat_cat_desc = iraw_mat_cat_desc
WHERE company = icompany;
loc_result = 'success';
RETURN loc_result ;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION rm_category_update(icompany bpchar, iraw_mat_cat_code bpchar, iraw_mat_cat_desc bpchar) OWNER TO postgres;
D'accord, donc si je saisis un enregistrement qui n'existe pas, par exemple le numéro 9, le résultat est positif même si je sais qu'il n'a rien mis à jour!
SQL ne génère-t-il pas d'erreurs s'il met à jour une ligne inexistante?
Merci
La solution
Cela dépend du SGBD - mais non, cela ne devrait pas générer d'erreur. Selon le standard SQL (ISO / IEC 9075: 2008 de nos jours), il convient de définir la condition SQLNOTFOUND (+100), qui est distincte de toute condition d'erreur. (Avec Informix, si vous utilisez une base de données MODE ANSI, vous obtenez SQLNOTFOUND; si vous utilisez une base de données non ANSI, vous obtenez 0 (pas d'erreur) comme condition. Les raisons de cette situation sont antérieures à la norme SQL-86 d'origine. )
Notez que SQL est un langage basé sur les ensembles. Ce que vous avez demandé, c’est que l’instruction mette à jour un ensemble de lignes (correspondantes) - et il est tout à fait correct de mettre à jour un ensemble contenant zéro ligne (correspondante).
Autres conseils
Vous pouvez utiliser "FOUND". pour détecter si la dernière instruction affecte une ou plusieurs lignes, voir Manuel .
Exemple:
-- snippet
IF FOUND THEN
loc_result = 'success';
ELSE
loc_result = 'failed'; -- or something similiar...
END IF;