Pregunta

Tengo una pregunta sobre una función de actualización que creé ...

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;

Bien, entonces si ingreso un registro que no existe, por ejemplo 9, ¡devuelve el éxito aunque sé que no ha actualizado nada!

¿SQL no arroja errores si está actualizando una fila inexistente?

Gracias

¿Fue útil?

Solución

Depende del DBMS, pero no, no debería arrojar un error. De acuerdo con el estándar SQL (ISO / IEC 9075: 2008 en estos días), debe establecer la condición SQLNOTFOUND (+100), que es independiente de cualquier condición de error. (Con Informix, si usa una base de datos MODE ANSI, obtiene SQLNOTFOUND; si usa una base de datos que no es ANSI, obtiene 0 (sin error) como condición. Las razones para eso son anteriores al estándar SQL-86 original. )

Tenga en cuenta que SQL es un lenguaje basado en conjuntos. Lo que solicitó fue que la instrucción actualice un conjunto de filas (coincidentes), y es perfectamente válido actualizar un conjunto que contenga cero filas (coincidentes).

Otros consejos

Puede usar " ENCONTRADO " para detectar si la última instrucción afectó a una o más filas, consulte Manual .

Ejemplo:

-- snippet
IF FOUND THEN
  loc_result = 'success';
ELSE
  loc_result = 'failed'; -- or something similiar...
END IF;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top