2008-11-19 9 views
1

J'ai une question au sujet d'une fonction de mise à jour que j'ai créé ...fonction de mise à jour dans PostgreSQL

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; 

Ok, donc si je entrer un enregistrement qui n'existe pas, par exemple 9, il renvoie un succès, même si Je sais qu'il n'a rien mis à jour!

Est-ce que SQL ne lance pas d'erreurs s'il met à jour une ligne inexistante?

Merci

Répondre

0

Il dépend du SGBD - mais non, il ne faut pas une erreur. Selon la norme SQL (ISO/CEI 9075: 2008 de nos jours), il doit 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 date sont antérieures à la norme SQL-86 d'origine.

Notez que SQL est un langage basé sur un ensemble. Ce que vous avez demandé, c'est que l'instruction mette à jour un ensemble de lignes (correspondantes) - et il est parfaitement valide de mettre à jour un ensemble contenant zéro (correspondant) lignes.

+0

réponse Impressionnant .... Merci Jonathan! –

1

Vous pouvez utiliser "FOUND" pour détecter si la dernière instruction a affecté une ou plusieurs lignes, voir Manual.

Exemple:

-- snippet 
IF FOUND THEN 
    loc_result = 'success'; 
ELSE 
    loc_result = 'failed'; -- or something similiar... 
END IF; 
Questions connexes