Вопрос

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

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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top