Domanda

Ho una domanda su una funzione di aggiornamento che ho creato ...

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;

Va ??bene, quindi se inserisco un record che non esiste, ad esempio 9, restituisce successo anche se so che non ha aggiornato nulla!

SQL non genera errori se aggiorna una riga inesistente ??

Grazie

È stato utile?

Soluzione

Dipende dal DBMS - ma no, non dovrebbe generare un errore. Secondo lo standard SQL (ISO / IEC 9075: 2008 in questi giorni), dovrebbe impostare la condizione SQLNOTFOUND (+100), che è separata da qualsiasi condizione di errore. (Con Informix, se si utilizza un database MODE ANSI, si ottiene SQLNOTFOUND; se si utilizza un database non ANSI, si ottiene 0 (nessun errore) come condizione. I motivi di tale data precedente allo standard SQL-86 originale. )

Nota che SQL è una lingua basata su set. Ciò che hai richiesto è stato che l'istruzione aggiorni un set di righe (corrispondenti) - ed è perfettamente valido aggiornare un set contenente zero (corrispondenti) righe.

Altri suggerimenti

Puoi utilizzare " FOUND " per rilevare se l'ultima istruzione ha interessato una o più righe, vedere Manuale .

Esempio:

-- snippet
IF FOUND THEN
  loc_result = 'success';
ELSE
  loc_result = 'failed'; -- or something similiar...
END IF;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top