Функция обновления в PostgreSQL

У меня вопрос относительно созданной мной функции обновления ...

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 не выдает ошибок, если он обновляет несуществующую строку ??

Спасибо

Что такое компоненты React? Введение в компоненты | Типы компонентов
Что такое компоненты React? Введение в компоненты | Типы компонентов
Компонент - это независимый, многократно используемый фрагмент кода, который делит пользовательский интерфейс на более мелкие части. Например, если мы...
1
0
9 495
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это зависит от СУБД - но нет, это не должно вызывать ошибки. В соответствии со стандартом 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;

Другие вопросы по теме