Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
PAGE 2
Обробка помилок і виключень (PostgreSQL для профессионалов, Дж. Уорсли, Дж. Дрейк, версія 7.1, стор. 350) (delete from tab where kod>2;)
Для ініціювання помилок і виключень у функціях PL/pgSQL служить команда RAISE. Вона передає задану інформацію механізму PostgreSQL elog (стандартна програма ведення протоколу помилок, дані зазвичай прямують у файл /var/log/messages або $PGDATA/serverlog з одночасним виведенням у потік stderr).
У команді RAISE можна вказати рівень помилки, а також включити змінні та вирази. Відповідні позиції цих змінних позначаються знаками відсотка (%). Команда має вигляд:
RAISE рівень 'повідомлення' [, ідентифікатор [...]];
Різні версії PL/pgSQL мають різну кількість рівнів повідомлень. З них тут розглядається три найбільш вживані, вони такі:
Помилка рівня EXCEPTION завершує виконання функції, в якій вона ініціалізована.
У лістингу 11.48 наведено приклад функції raise_err(), яка містить ініціалізацію виключень і помилки. Проведемо експеримент, запустимо цю програму два рази з різними умовами.
Лістинг 11.48 Команда RAISE
CREATE OR REPLACE FUNCTION raise_err()
RETURNS integer AS
$BODY$
DECLARE
i integer:= 3;
BEGIN
RAISE DEBUG 'Вивести повідомлення рівня DEBUG';
i:=i*2;
RAISE NOTICE 'Рівень NOTICE';
RAISE NOTICE 'Рівень NOTICE з виводом і=%', i;
RAISE EXCEPTION 'Рівень EXCEPTION і=% (кінець)', i;
RETURN i;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
Результати виконання функції. Повідомлення DEBUG відсутнє, оскільки база даних працює не в налагоджувальному режимі. Інші повідомлення такі:
1. результати в розділі Messages вікна SQL:
NOTICE: Рівень NOTICE
NOTICE: Рівень NOTICE з виводом і=6
ERROR: Рівень EXCEPTION і=6 (кінець)
Програма завершена аварійно, результат у вікні Data Output відсутній.
2. виключено рівень EXCEPTION
NOTICE: Рівень NOTICE
NOTICE: Рівень NOTICE з виводом і=6
Результати в розділі Data Output:
6
39.8 Помилки та повідомлення (Версія PostgreSQL 9.0 Beta)
Для видачі повідомлень і виклику помилок використовується оператор RAISE.
RAISE [ level ] format [, expression [, ... ]] [ USING option = expression [, ... ]];
RAISE [ level ] condition_name [ USING option = expression [, ... ] ];
RAISE [ level ] SQLSTATE sqlstate [ USING option = expression [, ... ] ];
RAISE [ level ] USING option = expression [, ... ];
RAISE;
Рівень визначає серйозність помилки. Допускаються рівні: DEBUG, LOG, INFO, NOTICE, WARNING, і EXCEPTION. Рівень EXCEPTION викликає помилку, яка зазвичай перериває поточну транзакцію, він встановлюється за замовчуванням; інші рівні тільки генерують повідомлення різних пріоритетів. Якщо повідомлення має особливий пріоритет або якщо контролюються змінні конфігурації log_min_messages і client_min_messages, то клієнт може його записати в журнал сервера. Див. розділ 18 для отримання додаткової інформації.
Після рівнів, пишеться формат, який повинен бути рядком літер. Формат рядка вказує текст повідомлення про помилку. Наприкінці рядка формату може стояти необовязковий аргумент вирази, які вставляються в повідомлення замість знака %, тобто цей знак замінюється значенням додаткового аргумента. Для букви % треба писати %%. У поданому нижче прикладі, значення v_job_id замінить % у рядок:
RAISE NOTICE Calling cs_create_job(%), v_job_id;
Можна розширити інформацію про помилку за допомогою виразу:
секція = значення.
Допускаються слова секції: MESSAGE, DETAIL, HINT, і ERRCODE, а кожне значення виразу може бути будь-яким рядком символів. MESSAGE задає текст повідомлення про помилку (ця секція не може використовуватися у вигляді RAISE, який включає рядок формату). DETAIL надає детальне повідомлення про помилку, а HINT підказку. ERRCODE вказує код помилки (SQLSTATE) або її імя, як показано в додатку, або безпосередньо код з пяти символів SQLSTATE. У цьому прикладі буде перервано операцію з видачею повідомлення про помилку і підказки:
RAISE EXCEPTION Nonexistent ID --> %, user_id
USING HINT = Please check your user id;
Нижче показано два приклади еквівалентних способи задання SQLSTATE:
RAISE Duplicate user ID: %, user_id USING ERRCODE = unique_violation;
RAISE Duplicate user ID: %, user_id USING ERRCODE = 23505;
Існує інший синтаксис, де головним аргументом є імя помилки або SQLSTATE:
RAISE division_by_zero;
RAISE SQLSTATE 22012;
У цей синтаксис, USING може бути використаний для утворення персоналізованого повідомлення про помилку, докладно або підказку. Ще один спосіб зробити раніше приклад
RAISE unique_violation USING MESSAGE = Duplicate user ID: || user_id;
Ще один варіант полягає в написанні RAISE USING or RAISE level USING і покласти все інше в USING список. Останній варіант RAISE не має всіх параметрів. Ця форма може використовуватися тільки всередині EXCEPTION блоку BEGIN, це призводить до помилки в поточному опрацьовуються бути знову кинули на наступному навколишній блок.
Якщо немає імені, ні вказаний в команді стан SQLSTATE в RAISE EXCEPTION, за замовчуванням використовується RAISE_EXCEPTION (P0001). Якщо немає тексту повідомлення не вказано, за замовчанням використовується ім'я умова або SQLSTATE як текстове повідомлення.
Примітка: При вказівці коду помилки за кодом SQLSTATE, ви не обмежені в зумовленні кодів помилок, але можна вибрати будь-яку помилку код, що складається з п'яти цифр та / або ASCII-літери верхнього регістру, крім 00000. Рекомендується уникати кодів помилок, які мають три нулі, тому що ці категорії кодів і може бути тільки захоплених захоплення всієї категорії.
Обробка помилки:
SELECT * INTO myrec FROM emp WHERE empname = myname;
IF NOT FOUND THEN
RAISE EXCEPTION employee % not found, myname;
END IF;
If the STRICT option is specified, the query must return exactly one row or a run-time error will be reported, either NO_DATA_FOUND (no rows) or TOO_MANY_ROWS (more than one row). You can use an exception block if you wish to catch the error, for example:
BEGIN
SELECT * INTO STRICT myrec FROM emp WHERE empname = myname;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE EXCEPTION employee % not found, myname;
WHEN TOO_MANY_ROWS THEN
RAISE EXCEPTION employee % not unique, myname;
END;
CREATE TABLE tab
(kod integer PRIMARY KEY NOT NULL, naz character(50));