1

我对我创建的更新功能有疑问...

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;

好的,所以如果我输入一条不存在的记录,例如 9,即使我知道它没有更新任何内容,它也会返回成功!

如果更新不存在的行,SQL 不会抛出错误吗?

谢谢

4

2 回答 2

1

您可以使用“FOUND”来检测最后一条语句是否影响了一行或多行,请参阅Manual

例子:

-- snippet
IF FOUND THEN
  loc_result = 'success';
ELSE
  loc_result = 'failed'; -- or something similiar...
END IF;
于 2008-11-19T08:17:53.747 回答
0

这取决于 DBMS - 但不,它不应该抛出错误。根据 SQL 标准(现在的 ISO/IEC 9075:2008),它应该设置 SQLNOTFOUND 条件(+100),这与任何错误条件是分开的。(对于 Informix,如果您使用 MODE ANSI 数据库,则会得到 SQLNOTFOUND;如果使用非 ANSI 数据库,则会得到 0(无错误)作为条件。其原因早于原始 SQL-86 标准。 )

请注意,SQL 是一种基于集合的语言。您要求的是该语句更新一组(匹配)行 - 更新包含零(匹配)行的集合是完全有效的。

于 2008-11-19T07:42:13.570 回答