Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Установка обработчика ошибок ВНЕ процедуры / 25 сообщений из 39, страница 1 из 2
15.12.2016, 10:58
    #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
15.12.2016, 11:01
    #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
15.12.2016, 11:03
    #39367434
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Установка обработчика ошибок ВНЕ процедуры
Zlatov вне процедурыНе совсем понял, где это могло бы быть. Ведь в MySQL анонимных процедур нет. И весь программный код (т.е. Compound-Statement) выполняется в процедурах, функциях, триггерах и ивентах.
...
Рейтинг: 0 / 0
15.12.2016, 12:34
    #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
15.12.2016, 13:05
    #39367602
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Установка обработчика ошибок ВНЕ процедуры
Zlatovа теперь можете меня причислить к ним.
Уже.

ZlatovСегодня я продолжу попытки кодить вне хранимки
Да хоть два раза. Вот только вне процедуры он никогда не будет выполнен.
Но если ты видишь смысл в написании кода, который не будет выполнен - кто мы, чтобы тебя отговаривать?
...
Рейтинг: 0 / 0
15.12.2016, 13:24
    #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
15.12.2016, 13:27
    #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
15.12.2016, 13:29
    #39367652
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Установка обработчика ошибок ВНЕ процедуры
[quot Zlatov]Это просто ужас какой-то, обгуглился в усмерть, помогите. Вопрос: можно ли установить обработчик на оределенный вид ошибок вне процедуры, как-то так?:


Да нельзя, нельзя. Только в процедуре или триггере.
...
Рейтинг: 0 / 0
15.12.2016, 13:32
    #39367659
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Установка обработчика ошибок ВНЕ процедуры
ТС, там ещё осторожно, эти хендлеры не работали в какой-то из первой релизнутой версии, где они появились.
...
Рейтинг: 0 / 0
15.12.2016, 13:37
    #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
15.12.2016, 13:43
    #39367673
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Установка обработчика ошибок ВНЕ процедуры
Zlatov,
на ошибках учатся.....
но только дураки на своих.......
...
Рейтинг: 0 / 0
15.12.2016, 13:46
    #39367675
Zlatov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Установка обработчика ошибок ВНЕ процедуры
miksoft,

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

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

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

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

Да, представте себе есть люди которые скулу знаю не "Полностью" как некоторые "вади". И доки читаю по мере необходимости.
...
Рейтинг: 0 / 0
15.12.2016, 13:52
    #39367688
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Установка обработчика ошибок ВНЕ процедуры
ZlatovТолько вот поверить никак не мог, что НИКАК ну НИКАК невозможно так сказать в "общем потоке" сделать все эти хендлеры транзакции...Грубо обработать ошибки можно, ваш способ вполне годится при определенных условиях. Но хендлеры - увы, либо в процедурах (функциях и т.п.), либо в клиентском коде (на PHP или кто чем пишет).
...
Рейтинг: 0 / 0
15.12.2016, 14:08
    #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
15.12.2016, 14:21
    #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
15.12.2016, 14:26
    #39367746
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Установка обработчика ошибок ВНЕ процедуры
Zlatovага, значит сначала я должен mysql -e "START TRANSACTION"
потом mysql < filename.sql
потом if [ $? ] then mysql -e "ROLLBACK;" else mysql -e "COMMIT;"Так не выйдет.Это будет три отдельных запуска mysql и, следовательно, три отдельных MySQL-сессии.
...
Рейтинг: 0 / 0
15.12.2016, 14:30
    #39367753
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Установка обработчика ошибок ВНЕ процедуры
ZlatovОднако при _ошибке_ в workbench останавливается ход выполнение и до ROLLBACK дело просто не доходит.В настройках это никак не регулируется?
...
Рейтинг: 0 / 0
15.12.2016, 14:51
    #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
15.12.2016, 15:05
    #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
15.12.2016, 15:27
    #39367842
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Установка обработчика ошибок ВНЕ процедуры
ZlatovЕсть пути в баше проще?Сходу не знаю. Для начала я бы проверил действие mysql при ошибке после явного начала транзакции. Если mysql завершится с откатом транзакции, то остается только закончить ее.
Т.е. как-то так:
Код: sql
1.
mysql -uroot -Dtreect2 -e "START TRANSACTION; source bashtransaction.sql; COMMIT;"
...
Рейтинг: 0 / 0
15.12.2016, 15:35
    #39367853
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Установка обработчика ошибок ВНЕ процедуры
miksoftДля начала я бы проверил действие mysql при ошибке после явного начала транзакции. Если mysql завершится с откатом транзакции
Ошибка, даже синтаксическая, не приводит к откату транзакции.
http://ru.stackoverflow.com/a/573657/203622
...
Рейтинг: 0 / 0
15.12.2016, 15:43
    #39367870
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Установка обработчика ошибок ВНЕ процедуры
MelkijmiksoftДля начала я бы проверил действие mysql при ошибке после явного начала транзакции. Если mysql завершится с откатом транзакции
Ошибка, даже синтаксическая, не приводит к откату транзакции.
http://ru.stackoverflow.com/a/573657/203622 Некорректный пример.
Там mysql используется в интерактивном режиме, а я говорю про опцию --execute, которая должна "Execute the statement and quit.". Вот как именно она сделает quit в случае ошибки - с откатом транзакции или с коммитом?
...
Рейтинг: 0 / 0
15.12.2016, 16:08
    #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
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Установка обработчика ошибок ВНЕ процедуры / 25 сообщений из 39, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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