存储过程中的MySQL异常处理不起作用

时间:2020-06-17 18:59:12

标签: mysql mysql-workbench

mysql版本:x86_64上用于Linux的mysql Ver 8.0.20(MySQL Community Server-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没有得到处理,而其他错误却给了我一个错误。
例如,当我尝试为“ vencimento”字段输入无效的“ F”时,会出现此错误。

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*/



更新2 ** 对于错误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'

0 个答案:

没有答案