2008-11-19 3 views
1

У меня есть вопрос, касающуюся функции обновления, я создал ...Обновления в 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 не бросает ошибки, если он обновляет несуществующую строку?

Благодаря

ответ

0

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

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

+0

Удивительный ответ .... Спасибо Джонатан! – 2008-11-19 08:09:50

1

Вы можете использовать «НАЙДЕН», чтобы определить, повлияло ли последнее заявление на одну или несколько строк, см. Manual.

Пример:

-- snippet 
IF FOUND THEN 
    loc_result = 'success'; 
ELSE 
    loc_result = 'failed'; -- or something similiar... 
END IF; 
Смежные вопросы