Функция обновления в PostgreSQL
-
08-07-2019 - |
Вопрос
У меня вопрос относительно созданной мной функции обновления...
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;