Функция обновления в PostgreSQL - PullRequest
1 голос
/ 19 ноября 2008

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

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

Спасибо

Ответы [ 2 ]

1 голос
/ 19 ноября 2008

Вы можете использовать «FOUND», чтобы определить, влияет ли последний оператор на одну или несколько строк, см. Ручная .

Пример:

-- snippet
IF FOUND THEN
  loc_result = 'success';
ELSE
  loc_result = 'failed'; -- or something similiar...
END IF;
0 голосов
/ 19 ноября 2008

Это зависит от СУБД - но нет, оно не должно выдавать ошибку. В соответствии со стандартом SQL (ISO / IEC 9075: 2008 в наши дни) он должен установить условие SQLNOTFOUND (+100), которое отделено от любого условия ошибки. (С Informix, если вы используете базу данных MODE ANSI, вы получаете SQLNOTFOUND; если вы используете базу данных не-ANSI, вы получаете 0 (без ошибок) в качестве условия. Причины этого предшествуют исходному стандарту SQL-86. )

Обратите внимание, что SQL - это язык на основе множеств. Вы просили, чтобы оператор обновил набор (совпадающих) строк - и совершенно правильно обновить набор, содержащий ноль (совпадающих) строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...