У меня вопрос относительно созданной мной функции обновления ...
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 не выдает ошибок, если он обновляет несуществующую строку ??
Спасибо
Это зависит от СУБД - но нет, это не должно вызывать ошибки. В соответствии со стандартом SQL (в наши дни ISO / IEC 9075: 2008) он должен устанавливать условие SQLNOTFOUND (+100), которое отдельно от любого состояния ошибки. (С Informix, если вы используете базу данных MODE ANSI, вы получите SQLNOTFOUND; если вы используете базу данных, отличную от ANSI, вы получите 0 (без ошибок) в качестве условия. Причины этого предшествуют исходному стандарту SQL-86. )
Обратите внимание, что SQL - это язык, основанный на наборах. Вы просили, чтобы инструкция обновляла набор (совпадающих) строк - и вполне допустимо обновлять набор, содержащий нулевые (совпадающие) строки.
Вы можете использовать «FOUND», чтобы определить, повлиял ли последний оператор на одну или несколько строк, см. Руководство по эксплуатации.
Пример:
-- snippet
IF FOUND THEN
loc_result = 'success';
ELSE
loc_result = 'failed'; -- or something similiar...
END IF;