MariaDB эквивалентно Oracle WHENEVER SQLERROR - PullRequest
0 голосов
/ 22 октября 2018

В 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.

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

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

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

  START TRANSACTION;

    stmt1;
    ....
    stmtN;

  COMMIT;
END
0 голосов
/ 22 октября 2018

В хранимой процедуре 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/en/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'.

...