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

Était-ce utile?

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top