função de atualização no PostgreSQL
-
08-07-2019 - |
Pergunta
Eu tenho uma pergunta sobre uma função de atualização que eu criei ...
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, então se a entrada I um registro que não existe, por exemplo, 9, ele retorna sucesso, embora eu sei que actualiza nada!
O SQL não jogue erros se for atualizar uma linha inexistente ??
Graças
Solução
Depende dos DBMS - mas não, ele não deve lançar um erro. De acordo com o padrão SQL (ISO / IEC 9075: 2008 nos dias de hoje), ele deve definir a condição SQLNOTFOUND (100), que é separado de qualquer condição de erro. (Com Informix, se você usar um banco de dados modo ANSI, você começa SQLNOTFOUND, se você usar um banco de dados não-ANSI, você recebe 0 (nenhum erro) como a condição As razões para que pré-data o original padrão SQL-86.. )
Note que o SQL é uma linguagem baseada em conjunto. O que você pediu foi que a atualização comunicado um conjunto de linhas (correspondência) - e é perfeitamente válida para atualizar um conjunto contendo zero linhas (correspondência)
.Outras dicas
Você pode usar "encontrado" para detectar se a última declaração afetada uma ou mais linhas, consulte manual .
Exemplo:
-- snippet
IF FOUND THEN
loc_result = 'success';
ELSE
loc_result = 'failed'; -- or something similiar...
END IF;