powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Установка обработчика ошибок ВНЕ процедуры
39 сообщений из 39, показаны все 2 страниц
Установка обработчика ошибок ВНЕ процедуры
    #39367426
Zlatov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это просто ужас какой-то, обгуглился в усмерть, помогите. Вопрос: можно ли установить обработчик на оределенный вид ошибок вне процедуры, как-то так?:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
DECLARE EXIT HANDLER FOR SQLEXCEPTION 
BEGIN
      ROLLBACK;
END;
START TRANSACTION;
    .. Query 1 ..
    .. Query 2 ..
    .. Query 3 ..
COMMIT;
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39367433
Zlatov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
версия:
Код: sql
1.
2.
mysqld -V
mysqld  Ver 5.5.50-0ubuntu0.14.04.1-log for debian-linux-gnu on x86_64 ((Ubuntu))
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39367434
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zlatov вне процедурыНе совсем понял, где это могло бы быть. Ведь в MySQL анонимных процедур нет. И весь программный код (т.е. Compound-Statement) выполняется в процедурах, функциях, триггерах и ивентах.
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39367554
Zlatov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

Вот сразу видно умного, но который так и рвется похоливарить и ткнуть топикстартера носом в лужу. Представте себе!!!, что 95% MySQL-щиков вообще не знают что существуют хранимые процедуры, триггеры и не дай бог транзакции с разными уровнями изоляций и всякими там (о ужас) блокировками на чтение... И у них у всех извращенное понимание: код MySQL выполняется без всяких процедур!!!, например, даже из консоли!!! И ваш вопрос ну просто ввергает их ступор и глаза у них размером со столовый поднос, каждый...

Представили? =) Вот, а теперь можете меня причислить к ним.

Сегодня я продолжу попытки кодить вне хранимки (и пусть это ввергает в непонимание остальных), и не знаю как сделать IF (вернее знаю, но хотелось бы услышать ответ от здешних):

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT @error_count := @@error_count;
START TRANSACTION;
INSERT INTO `tree` (`pid`, `header`)
VALUES
 (null, '1')
,(1, '2')
;

SELECT IF(@@session.error_count>@error_count,ROLLBACK,COMMIT);
IF ... THEN
	ROLLBACK
ELSE
	COMMIT;
END;
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39367602
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zlatovа теперь можете меня причислить к ним.
Уже.

ZlatovСегодня я продолжу попытки кодить вне хранимки
Да хоть два раза. Вот только вне процедуры он никогда не будет выполнен.
Но если ты видишь смысл в написании кода, который не будет выполнен - кто мы, чтобы тебя отговаривать?
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39367645
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZlatovСегодня я продолжу попытки кодить вне хранимки (и пусть это ввергает в непонимание остальных), и не знаю как сделать IFНе верите тому, что пишут на форумах - читайте документацию.
http://dev.mysql.com/doc/refman/5.7/en/if.html The IF statement for stored programs implements a basic conditional construct.

P.S. Не путать с функцией IF() .
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39367649
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И, кстати, по исходному вопросу:
http://dev.mysql.com/doc/refman/5.7/en/declare.html DECLARE is permitted only inside a BEGIN ... END compound statement and must be at its start, before any other statements. http://dev.mysql.com/doc/refman/5.7/en/declare.html This section describes the syntax for the BEGIN ... END compound statement and other statements that can be used in the body of stored programs: Stored procedures and functions, triggers, and events.
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39367652
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Zlatov]Это просто ужас какой-то, обгуглился в усмерть, помогите. Вопрос: можно ли установить обработчик на оределенный вид ошибок вне процедуры, как-то так?:


Да нельзя, нельзя. Только в процедуре или триггере.
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39367659
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТС, там ещё осторожно, эти хендлеры не работали в какой-то из первой релизнутой версии, где они появились.
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39367667
Zlatov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторAkinaZlatovа теперь можете меня причислить к ним.
Уже.

Воо, спасибо, значит мы найдем общий язык.

авторZlatovСегодня я продолжу попытки кодить вне хранимки
Да хоть два раза. Вот только вне процедуры он никогда не будет выполнен.
Но если ты видишь смысл в написании кода, который не будет выполнен - кто мы, чтобы тебя отговаривать?

Конечно вы для меня - никто ))), но на счет смысла я всетаки подскажу: я прям практик и пока не проверю эту саму теорию так сказать на пальцах - не поверю. Вот не поленился, проверил, действительно не работает!!! ))):

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
SET AUTOCOMMIT = 0; SET FOREIGN_KEY_CHECKS = 0; SET UNIQUE_CHECKS = 0;
truncate `treerel`;
truncate `tree`;
SET AUTOCOMMIT = 1; SET FOREIGN_KEY_CHECKS = 1; SET UNIQUE_CHECKS = 1;

SELECT * FROM tree;


SELECT @error_count := @@error_count;
START TRANSACTION;
INSERT INTO `tree` (`pid`, `header`)
VALUES
 (null, '1')
;
INSERT INTO `tree` (`pid`, `header`)
VALUES
 (1, '1')
;
INSERT INTO `tree` (`pid`, `header`)
VALUES
 (null, '2')
;
SET @sql = (SELECT IF(
    @@session.error_count>@error_count,
    "ROLLBACK;",
    "COMMIT;"
));
PREPARE stmt FROM @sql;
EXECUTE stmt;
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39367673
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zlatov,
на ошибках учатся.....
но только дураки на своих.......
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39367675
Zlatov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

Спасибо, всё это я читал. Только вот поверить никак не мог, что НИКАК ну НИКАК невозможно так сказать в "общем потоке" сделать все эти хендлеры транзакции...

И скорее всего назрел вопрос конкретный и по сути: Чем же отличаеются "Места" выполенния sql кода в "консоли" (ну или из MySQL Workbench) и в "процедуре". То есть почему конструкции IF, DECLARE... в одном месте можно, а в другом - нет..?
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39367678
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZlatovВот не поленился, проверилИ где же в приведенном коде секция DECLARE или оператор IF ? Или, хотя бы, "обработчик на оределенный вид ошибок" ?

И хорошо бы указать, как именно запускается данный код. Ибо в консоли mysql и в своем приложении результат может быть разным.
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39367680
Zlatov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяZlatov,
на ошибках учатся.....
но только дураки на своих.......

Да что ж такие все умные, никакая это не ошибка, это проверка той теории которая написана в доках.

Да, представте себе есть люди которые скулу знаю не "Полностью" как некоторые "вади". И доки читаю по мере необходимости.
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39367688
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZlatovТолько вот поверить никак не мог, что НИКАК ну НИКАК невозможно так сказать в "общем потоке" сделать все эти хендлеры транзакции...Грубо обработать ошибки можно, ваш способ вполне годится при определенных условиях. Но хендлеры - увы, либо в процедурах (функциях и т.п.), либо в клиентском коде (на PHP или кто чем пишет).
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39367716
Zlatov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftZlatovВот не поленился, проверилИ где же в приведенном коде секция DECLARE или оператор IF ? Или, хотя бы, "обработчик на оределенный вид ошибок" ?

И хорошо бы указать, как именно запускается данный код. Ибо в консоли mysql и в своем приложении результат может быть разным.

Ну IF завуалирован тут:
Код: sql
1.
2.
3.
4.
5.
6.
7.
SET @sql = (SELECT IF(
    @@session.error_count>@error_count,
    "ROLLBACK;",
    "COMMIT;"
));
PREPARE stmt FROM @sql;
EXECUTE stmt;



А DECLARE вы ж сам знаете что нельзя его вне процедуры ). Целью было не декларе. А проверить START TRANSACRION; ROLLBACK;

Запускаю прям из MySQL Workbench. Мне в нём сподручней для быстрых тестов.
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39367736
Zlatov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Однако при _ошибке_ в workbench останавливается ход выполнение и до ROLLBACK дело просто не доходит.

Прям печаль.

Только процедуры, только хардкор =(




И вот допустим я храню файлик спец данных (куча инсертов) в SQL формате так сказать. и вот я на баше хочу отправить текст файла в mysql < filename.sql но так, чтобы либо все добавилось, либо если где-то ошибка - то ничего.

ага, значит сначала я должен mysql -e "START TRANSACTION"
потом mysql < filename.sql
потом if [ $? ] then mysql -e "ROLLBACK;" else mysql -e "COMMIT;"

Не хранимку же ради этого создавать? правильно?
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39367746
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zlatovага, значит сначала я должен mysql -e "START TRANSACTION"
потом mysql < filename.sql
потом if [ $? ] then mysql -e "ROLLBACK;" else mysql -e "COMMIT;"Так не выйдет.Это будет три отдельных запуска mysql и, следовательно, три отдельных MySQL-сессии.
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39367753
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZlatovОднако при _ошибке_ в workbench останавливается ход выполнение и до ROLLBACK дело просто не доходит.В настройках это никак не регулируется?
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39367788
Zlatov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftZlatovага, значит сначала я должен mysql -e "START TRANSACTION"
потом mysql < filename.sql
потом if [ $? ] then mysql -e "ROLLBACK;" else mysql -e "COMMIT;"Так не выйдет.Это будет три отдельных запуска mysql и, следовательно, три отдельных MySQL-сессии.

Аааа это действительно так как вы сказали (((((
Код: sql
1.
2.
3.
INSERT INTO `tree` (`pid`, `header`) VALUES (null, '1');
INSERT INTO `tree` (`pid`, `header`) VALUES (1, '1');
INSERT INTO `tree` (`pid`, `header`) VALUES (null, '2');



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
#/bin/bash
export MYSQL_PWD="************"
mysql -uroot -Dtreect2 -e "START TRANSACTION;"
mysql -uroot -Dtreect2 < bashtransaction.sql
if [[ $? -eq 1 ]]
	then
		mysql -uroot -Dtreect2 -e "ROLLBACK;"
        echo -e "Ошибка, откат."
	else
		mysql -uroot -Dtreect2 -e "COMMIT;"
        echo -e "Ок, коммит."
fi






Пишет: ошибка, откат, но первый инсёрт не откатывается (header - unique field в моей таблице)
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39367809
Zlatov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftZlatovОднако при _ошибке_ в workbench останавливается ход выполнение и до ROLLBACK дело просто не доходит.В настройках это никак не регулируется?

Да наверняка регулируется, но я пишу код не для того чтобы его из бенча вызывать, так что он обойдётся)

с башем можно пойти по пути изврата (перенаправления вывода)
Код: powershell
1.
2.
3.
4.
exec 3> >(mysql)
echo "SELECT 1;" >&3
echo "SELECT 2;" >&3
exec 3>&-


Действительно оно стоит того? Есть пути в баше проще?

С пыхом, проще, мы там в одной сессии - юзаем PDO - ловим PDOException - все счастливы, правильно?
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39367842
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZlatovЕсть пути в баше проще?Сходу не знаю. Для начала я бы проверил действие mysql при ошибке после явного начала транзакции. Если mysql завершится с откатом транзакции, то остается только закончить ее.
Т.е. как-то так:
Код: sql
1.
mysql -uroot -Dtreect2 -e "START TRANSACTION; source bashtransaction.sql; COMMIT;"
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39367853
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftДля начала я бы проверил действие mysql при ошибке после явного начала транзакции. Если mysql завершится с откатом транзакции
Ошибка, даже синтаксическая, не приводит к откату транзакции.
http://ru.stackoverflow.com/a/573657/203622
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39367870
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MelkijmiksoftДля начала я бы проверил действие mysql при ошибке после явного начала транзакции. Если mysql завершится с откатом транзакции
Ошибка, даже синтаксическая, не приводит к откату транзакции.
http://ru.stackoverflow.com/a/573657/203622 Некорректный пример.
Там mysql используется в интерактивном режиме, а я говорю про опцию --execute, которая должна "Execute the statement and quit.". Вот как именно она сделает quit в случае ошибки - с откатом транзакции или с коммитом?
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39367919
Zlatov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

получилось так:
файл bashtransaction.sql:
Код: sql
1.
2.
3.
INSERT INTO `tree` (`pid`, `header`) VALUES (null, '1');
INSERT INTO `tree` (`pid`, `header`) VALUES (1, '1'); -- Тут д.б. ошибка т.к. поле header - uq
INSERT INTO `tree` (`pid`, `header`) VALUES (null, '2');



Код: powershell
1.
2.
3.
$ mysql -uroot -Dtreect2 -p -e "START TRANSACTION; source bashtransaction.sql; COMMIT;"
Enter password: 
ERROR 1062 (23000) at line 2 in file: 'bashtransaction.sql': Duplicate entry '1' for key 'uq_tree_header'



Код: sql
1.
SELECT * FROM tree;


= пусто

такое ощущение, что кто-то выполнил ROLLBACK.

Вот как мне думается: выполняется START TRANSACTION;
потом выполняется INSERT INTO (первый)
потом выполняется INSERT INTO (второй) - вываливается ошибка
... а дальше просто сессия закрывается, а так как она закрывается, но при этом открытая транзакция, то выполняется ROLLBACK.

Как то так?
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39367924
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft, хм. Проверил на своей 5.7.15 - действительно через execute не закоммитил запросы с ошибками, даже выполненные через source. Прерывает выполнение при первой встреченной ошибке и остальные запросы уже не пытается исполнять.
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39367928
Zlatov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Продолжаем издеваться и убираем транзакцию:
Код: powershell
1.
2.
3.
$ mysql -uroot -Dtreect2 -p -e "SET AUTOCOMMIT=1; source bashtransaction.sql;"
Enter password: 
ERROR 1062 (23000) at line 2 in file: 'bashtransaction.sql': Duplicate entry '1' for key 'uq_tree_header'



Проверяем (SELECT * FROM tree;) и да - есть результаты первого инсерта.
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39367930
Zlatov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Melkijmiksoft, хм. Проверил на своей 5.7.15 - действительно через execute не закоммитил запросы с ошибками, даже выполненные через source. Прерывает выполнение при первой встреченной ошибке и остальные запросы уже не пытается исполнять.

не закомитил - выполнил ролбэк??? тоесть результаты первых """успешно""" выполненных проигнорил? я правильно понял ваш тест? (это правильно поведение транзакции поидее)
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39367934
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовал воспроизвести. Не получилось. Записи, добавляемые в корректных запросах, исправно пополнили таблицу. Server version: 5.7.16-log MySQL Community Server (GPL).
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39367945
Zlatov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaПопробовал воспроизвести. Не получилось. Записи, добавляемые в корректных запросах, исправно пополнили таблицу. Server version: 5.7.16-log MySQL Community Server (GPL).

Стоп. Записи в корректных запросах должны пополнять таблицу. И таблица не должна пополняться никакими записями, если хотя-бы одна не верна.

Так что вы проверили только первую часть - поплнение верными данными если все верны. Или я что-то не так понял? Можно поточнее описывать то что вы на вход так сказать даёте? =)
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39367946
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZlatovMelkijmiksoft, хм. Проверил на своей 5.7.15 - действительно через execute не закоммитил запросы с ошибками, даже выполненные через source. Прерывает выполнение при первой встреченной ошибке и остальные запросы уже не пытается исполнять.

не закомитил - выполнил ролбэк??? тоесть результаты первых """успешно""" выполненных проигнорил? я правильно понял ваш тест? (это правильно поведение транзакции поидее)
Да, rollback и ничего сохранено не будет. Это как раз нормальное поведение, в отличии от моего примера с ruSO.
Скорей всего клиент не командует rollback сам, а просто отключается. Отключение клиента при открытой транзакции вызывает rollback.

Без транзакции - тоже нормальное поведение, первый результат закоммитился до начала выполнение второго и поэтому не был отменён.

AkinaПопробовал воспроизвести. Не получилось. Записи, добавляемые в корректных запросах, исправно пополнили таблицу
Все запросы в командах были корректны? Или записались только корректные при наличии одного или нескольких некорректных, но те запросы пропустились?
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39367953
Zlatov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Полный стек кода так сказать (код весь ручками писался, прям каждая кавычечка):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
DROP DATABASE IF EXISTS `treect2`;
CREATE SCHEMA `treect2` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

USE `treect2`;

DROP TABLE IF EXISTS `treerel`;
DROP TABLE IF EXISTS `tree`;
CREATE TABLE IF NOT EXISTS `tree` (
  `id` INT unsigned NOT NULL AUTO_INCREMENT,
  `pid` INT unsigned NULL DEFAULT NULL,
  `header` VARCHAR(180) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uq_tree_header` (`header` ASC)
)
ENGINE InnoDB
AUTO_INCREMENT 1
DEFAULT CHARACTER SET utf8
COLLATE utf8_general_ci;

ALTER TABLE `tree`
  ADD CONSTRAINT `fk_tree_pid` FOREIGN KEY (`pid`) REFERENCES `tree` (`id`) ON UPDATE CASCADE ON DELETE RESTRICT;

CREATE TABLE IF NOT EXISTS `treerel` (
  `aid` INT unsigned NOT NULL,
  `did` INT unsigned NOT NULL,
  -- `level` INT unsigned NOT NULL,
  UNIQUE KEY `uq_treerel_adid` (`aid` ASC, `did` ASC),
  CONSTRAINT `fk_treerel_aid` FOREIGN KEY (`aid`) REFERENCES `tree` (`id`) ON UPDATE CASCADE ON DELETE RESTRICT,
  CONSTRAINT `fk_treerel_did` FOREIGN KEY (`did`) REFERENCES `tree` (`id`) ON UPDATE CASCADE ON DELETE RESTRICT
)
ENGINE InnoDB
DEFAULT CHARACTER SET utf8
COLLATE utf8_general_ci;

DROP TRIGGER IF EXISTS `tai_tree`;
DROP TRIGGER IF EXISTS `tbd_tree`;
DROP TRIGGER IF EXISTS `tbu_tree`;

CREATE TRIGGER `tai_tree` AFTER INSERT ON `tree` FOR EACH ROW
trigger_label:BEGIN
	IF @disable_triggers IS NULL THEN
		-- Если вставляем элемент в корень, то связи не добавляем
		IF NEW.`pid` IS NULL THEN
			LEAVE trigger_label;
		END IF;
		-- Вставляем связи
		INSERT INTO `treerel` (`aid`, `did`)
			-- Выбираем предков указанного родителя (did = idРодителя)
			-- и вставляем записи типа: idПредка, нашId
			SELECT `aid`, NEW.`id`
			FROM `treerel`
		    WHERE `did` = NEW.`pid`
			-- Родитель тоже предок
		    UNION ALL
		    SELECT NEW.`pid`, NEW.`id`;
	END IF;
END;



файлик для теста (bashtransaction.sql):
Код: sql
1.
2.
3.
INSERT INTO `tree` (`pid`, `header`) VALUES (null, '1');
INSERT INTO `tree` (`pid`, `header`) VALUES (1, '1'); -- Тот самый инсерт с ошибкой
INSERT INTO `tree` (`pid`, `header`) VALUES (null, '2');



Запускаем из консоли
Код: powershell
1.
mysql -uroot -Dtreect2 -p -e "START TRANSACTION; source bashtransaction.sql; COMMIT;"
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39367982
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MelkijВсе запросы в командах были корректны? Или записались только корректные при наличии одного или нескольких некорректных, но те запросы пропустились?
Так, поспешил, был неточен.

Запускались .sql приблизительно такого контента:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
create table test (
id serial primary key,
val int not null unique
);

insert into test (val)
select 1 union
select 2 ;

start transaction;

insert into test (val) select 3;
insert into test (val) select 2;
insert into test (val) select 4;

commit;

select * from test;

drop table test;


Если запускается из консоли - выполняются все запросы, кроме ошибочного.
Если запускается из командной строки - выполняются все запросы до ошибочного, откат к началу транзакции (при отсутствии неоткатываемых или тех, что до последнего запроса, вызывающего безусловную фиксацию). Где транзакция - в файле или в --execute - неважно.
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39368074
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zlatov,

какой смысл того что вы хотите?
приведите ворк-флоу, юс-кейс...

кроме бегин-комит-ролбак можно продумать аналогичные
логические ворк-флов, если это вообше возможно.
примерный подход -- писать код который НЕ сломается, а
ексепшн будет отмечен и записан. Затем проходит логическая
проверка результата и делается ручной комит или ролбак.

Ноте-1: не все ошибки можно задавить....
Ноте-2: логические/ручные трансакции хуже чем родные трансакции в плане стабильности
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39368284
Zlatov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbcZlatov,

какой смысл того что вы хотите?
приведите ворк-флоу, юс-кейс...

кроме бегин-комит-ролбак можно продумать аналогичные
логические ворк-флов, если это вообше возможно.
примерный подход -- писать код который НЕ сломается, а
ексепшн будет отмечен и записан. Затем проходит логическая
проверка результата и делается ручной комит или ролбак.

Ноте-1: не все ошибки можно задавить....
Ноте-2: логические/ручные трансакции хуже чем родные трансакции в плане стабильности

Изначально я хотел вне всяких процедур декларировать прослушку на ошибки для своевременного отката, поясню:
Есть текстовый файлик с 100500 иструкциями вставки. Было желание просто подать его на вход консольного mysql или в PDO->exec() и причем не заботиться проверкой была ли там ошибка или нет и ручками не писать commit или rollback - Сам файл должен был заботиться и содержать в себе код для отлова ошибок и rollback. Что уже звучит довольно бредово)))) Нет, конечно все возможно, но это неправильный путь изобретения велосипедов.
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39368389
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZlatovИзначально я хотел вне всяких процедур декларировать прослушку на ошибки для своевременного отката1) Ошибка может быть ТОЛЬКО внутри solid statement (процедуры, функции, триггера или одиночного запроса).
2) Обработчик ошибки имеет скоп solid statement (глобальный - не переопределяется), а потому имеет смысл только внутри скопа соотв. типа. Если он вне скопа, у него отсутствует область видимости.

ZlatovЕсть текстовый файлик с 100500 иструкциями вставки. Было желание просто подать его на вход консольного mysql или в PDO->exec() и причем не заботиться проверкой была ли там ошибка или нет и ручками не писать commit или rollback - Сам файл должен был заботиться и содержать в себе код для отлова ошибок и rollback.
Ну так и рисуйте этот хэндлер внутри "файлика", а сами инструкции оберните в процедуру и добавьте строку её запуска. Или оформите выполнение инструкций файла из статической ХП с соотв. хэндлером. Кстати, можно будет там даже натыкать SAVEPOINT-ов, если файл содержит несколько самостоятельных блоков.
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39368433
Zlatov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

Вот именно _незнание_ вашего первого пояснения послало меня писать "отлов" ошибок вне "solid statement". Сейчас кое что (но далеко не всё) в моей голове стало на свои места.

Спасибо всем.
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39368708
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaZlatovИзначально я хотел вне всяких процедур декларировать прослушку на ошибки для своевременного отката1) Ошибка может быть ТОЛЬКО внутри solid statement (процедуры, функции, триггера или одиночного запроса).
2) Обработчик ошибки имеет скоп solid statement (глобальный - не переопределяется), а потому имеет смысл только внутри скопа соотв. типа. Если он вне скопа, у него отсутствует область видимости.

ZlatovЕсть текстовый файлик с 100500 иструкциями вставки. Было желание просто подать его на вход консольного mysql или в PDO->exec() и причем не заботиться проверкой была ли там ошибка или нет и ручками не писать commit или rollback - Сам файл должен был заботиться и содержать в себе код для отлова ошибок и rollback.
Ну так и рисуйте этот хэндлер внутри "файлика", а сами инструкции оберните в процедуру и добавьте строку её запуска. Или оформите выполнение инструкций файла из статической ХП с соотв. хэндлером. Кстати, можно будет там даже натыкать SAVEPOINT-ов, если файл содержит несколько самостоятельных блоков.


...ок, боль-мень понятно... можно рассмотреть такой вариант:

1. грузить строки в большое техтовое поле, т.е. задумать процез загрузки
который не ломается
2. парсить строчки уже внутри базы, внутри отдельной процедуры со
всеми еррор-чандлерами и любой сложной дополнительной логикой.

совмещать большую загрузку и сложную логику -- в общем виде -- некамильфо.
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39368962
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё разумнее - выгружать где-то и потом загружать тут только данные. SELECT INTO OUTFILE и соответственно LOAD DATA INFILE в помощь. А структуру, если она неизвестна, можно передать в форме скрипта. Отдельно от данных.
...
Рейтинг: 0 / 0
39 сообщений из 39, показаны все 2 страниц
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Установка обработчика ошибок ВНЕ процедуры
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]