0

Я хочу проверить во время запроса, если ограничение соблюдается, если они не вместо отправки сообщения ERROR, просто верните FALSE. Как мне это сделать?Функция проверки ограничений SQL

Пример СТОЛ Я использую:

CREATE TABLE tree (
    name VARCHAR(64) UNIQUE PRIMARY KEY, 
    leaf INT CHECK (leaf > 0) 
); 

Пример функций я хотел бы использовать:

CREATE FUNCTION add_tree(name, nb_leaf) RETURNS BOOLEAN; 
CREATE FUNCTION remove_leaf(tree_name, leaf_to_remove) RETURNS BOOLEAN; 

В моей функции, было бы слишком повторы, чтобы проверить имя

IF EXISTS (SELECT name FROM tree WHERE name=tree_name) THEN... 

Поскольку у меня уже есть ограничение UNIQUE, но если я не проверю, я получаю сообщение об ошибке, конечно, как мне t использовать проверку (IF ..) и не получать сообщение об ошибке, а вместо этого возвращать false, если вход неправильный?

PS: Я использую PostgreSQL, если это меняет что-либо

+0

В Oracle вы можете создать определение пользователя исключений. Я уверен, что это должно быть возможным и в постгрессии. Когда ошибка выполнена, вы можете вернуть false – massie

ответ

0

Когда возбуждается исключение, возвращать ложь от вашей функции:

EXCEPTION 
    WHEN OTHERS THEN 
    return false; 
END; 

http://www.postgresql.org/docs/9.3/static/plpgsql-control-structures.html

В конце страницы вы см. пример:

DECLARE 
    text_var1 text; 
    text_var2 text; 
    text_var3 text; 
BEGIN 
    -- some processing which might cause an exception 
    ... 
EXCEPTION WHEN OTHERS THEN 
    GET STACKED DIAGNOSTICS text_var1 = MESSAGE_TEXT, 
          text_var2 = PG_EXCEPTION_DETAIL, 
          text_var3 = PG_EXCEPTION_HINT; 
END; 
+0

, но этот синтаксис заставит меня делать КОГДА СУЩЕСТВУЕТ (SELECT name FROM tree WHERE name = имя_данных) THEN ..., который не отличается от этого в моей основной функции нет? (из-за того, что я не могу использовать WHEN, увеличивая исключение, я получаю сообщение об ошибке «raise») – sourpet

+0

В вашей функции add_tree вы можете написать вставку (я думаю, вы это делаете), и когда это произойдет из-за уникального ограничения или другой ошибки, ваш EXCEPTION поймает ее и return false. В Oracle вы можете использовать ИСКЛЮЧЕНИЕ КОГДА ДРУГИХ ТОГДА. В postgresql также. – massie

+0

Да! ДРУГИЕ работали спасибо! – sourpet

Смежные вопросы