В Oracle sqlplus при написании скрипта мы можем использовать WHENEVER SQLERROR для обнаружения / обработки ошибок.

Например

sqlplus /nolog -S <<EOF

WHENEVER SQLERROR EXIT FAILURE ROLLBACK

CONNECT /

EXEC ThisProcThrowsAnError();

QUIT

EOF

if [ ${?} -eq 0 ]
then
   echo "Worked OK"
else
   echo "Oh dear"
fi

Есть ли аналог в MariaDB (клиент mysql)?

Обратите внимание: меня интересует не только хранимая процедура, но и любые ошибки, которые могут привести к ошибке при выполнении сценария в MariaDB.

0
TenG 22 Окт 2018 в 16:56

2 ответа

Лучший ответ

В хранимой процедуре MySQL / MariaDB вы можете написать такие вещи, например:

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
BEGIN
  ROLLBACK;
  @error := 'got exception';
END;

Вы также можете написать DECLARE EXIT HANDLER FOR condition statement.

Вне хранимой процедуры вы не можете перехватывать исключения (за исключением клиентской программы).

Вот документация. https://dev.mysql.com/doc/refman/ 8.0 / ен / DECLARE - handler.html

Если вы ищете ошибки MySQL в текстовом файле, вы можете попробовать это регулярное выражение

/^ERROR\s+\d{4}\s*([A-Z0-9]{5}):\s*.*$/

Он ищет такие вещи, как ERROR 2003 (HY000): Can't connect to MySQL server on '172.16.1.169'.

1
O. Jones 22 Окт 2018 в 20:41

MariaDB 10.1 поддерживает операторы атомарных соединений. Это позволяет создавать обработчики исключений вне хранимых процедур.

BEGIN NOT ATOMIC
  DECLARE EXIT HANDLER FOR SQLEXCEPTION
  BEGIN  
   ROLLBACK;
   RESIGNAL;
  END;

  START TRANSACTION;

    stmt1;
    ....
    stmtN;

  COMMIT;
END
0
markusjm 29 Окт 2018 в 14:30
52931153