Mysql обработка исключений в хранимой процедуре не работает - PullRequest
0 голосов
/ 17 июня 2020

mysql версия: mysql Версия 8.0.20 для Linux на x86_64 (MySQL Сервер сообщества - GPL)

Моя процедура:

DELIMITER //
CREATE PROCEDURE InserirMedico(
    IN nome varchar(50),
    IN sexo char(1),
    IN nascimento date,
    IN id_horario int,
    IN vencimento int)
    BEGIN 
        DECLARE EXIT HANDLER FOR 1062 SELECT 'Duplicate keys error encountered';
        DECLARE EXIT HANDLER FOR 1318 SELECT 'Incorrect number of arguments';
        DECLARE EXIT HANDLER FOR 1048 SELECT 'Invalid null field';
        DECLARE EXIT HANDLER FOR 1452 SELECT 'One or more foreign key constraints failed';
        DECLARE EXIT HANDLER FOR 3819 SELECT 'One or more check constraints failed';
        DECLARE EXIT HANDLER FOR 1366 SELECT 'One or more columns has a incorrect data type';

        INSERT INTO medicos values (null, nome, sexo, nascimento, id_horario, vencimento);
    END //
DELIMITER ;

Моя проблема заключается в том, что не все ошибки обрабатываются.
Ошибка 1062,1366,1318 не обрабатывается и выдает мне ошибку, в то время как другие ошибки обрабатываются.
Например, когда я пытаюсь ввести недопустимую букву F для " vencimento ", это дает мне эту ошибку.

Error Code: 1366. Incorrect integer value: 'F' for column 'vencimento' at row 1



ОБНОВЛЕНИЕ * Предоставляется недостающая информация

create table horarios(
    id_horario int(3) primary key auto_increment,
    hora_inicio time not null,
    hora_fim time not null
);
create table medicos(
    id_med int primary key auto_increment,
    nome varchar(50) not null,
    sexo char(1) not null,
    data_nasc date not null,
    id_horario int not null,
    vencimento int not null,
    constraint fk_medicos_id_horario foreign key (id_horario) references horarios(id_horario),
    constraint CHK_medicos_ven check (vencimento > 0),
    constraint CHK_medicos_sexo CHECK (sexo IN('F','M'))
);

Тестирование обработчиков

CALL InserirMedico("Mariana Venâncio", 'F', "1990:10:02",2,1000); /*Valid info*/
CALL InserirMedico("Mariana Venâncio", 'F', "1990:10:02",2,'F'); /*Error 1366*/
CALL InserirMedico("Mariana Venâncio", 'F', "1990:10:02",2);  /*Error 1318*/



Update2 ** Для ошибки 1062

У меня есть следующая таблица

create table tipo_pagamento(
    cod_tipo char(1) primary key,
    descricao varchar(25) unique not null,
    estado bool not null
);
DELIMITER //
CREATE PROCEDURE InserirTipoDePagamento(
    IN cod_tipo char(1),
    IN descricao varchar(25),
    IN estado bool)
    BEGIN
        DECLARE EXIT HANDLER FOR 1062 SELECT 'Duplicate keys error encountered';
        DECLARE EXIT HANDLER FOR 1048 SELECT 'Invalid null field';


        INSERT INTO tipo_pagamento VALUES (cod_tipo, descricao, estado);
    END //
DELIMITER ;
CALL InserirTipoDePagamento('T', 'Teste', true);

Ответ:

Error Code: 1062. Duplicate entry 'T' for key 'tipo_pagamento.PRIMARY'
...