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

Foi útil?

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;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top