[MDEV-8848] Error transaccional al momento de insertar un valor con campo en blanco Created: 2015-09-25  Updated: 2015-10-24  Resolved: 2015-10-24

Status: Closed
Project: MariaDB Server
Component/s: Data Definition - Procedure
Affects Version/s: 10.0.20
Fix Version/s: N/A

Type: Bug Priority: Major
Reporter: Willy Rosal Assignee: Unassigned
Resolution: Not a Bug Votes: 0
Labels: None
Environment:

MariaDb para Linux Debian Jessy



 Description   

CREATE  TABLE IF NOT EXISTS `mydb`.`Padre` (
  `idPadre` INT NOT NULL ,
  `nombre` VARCHAR(45) NULL ,
  PRIMARY KEY (`idPadre`) )
ENGINE = InnoDB;

CREATE  TABLE IF NOT EXISTS `mydb`.`Hijo` (
  `idHijo` INT NOT NULL AUTO_INCREMENT ,
  `nombre` VARCHAR(45) NULL ,
  `Padre_idPadre` INT NOT NULL ,
  PRIMARY KEY (`idHijo`, `Padre_idPadre`) ,
  INDEX `fk_Hijo_Padre` (`Padre_idPadre` ASC) ,
  CONSTRAINT `fk_Hijo_Padre`
    FOREIGN KEY (`Padre_idPadre` )
    REFERENCES `mydb`.`Padre` (`idPadre` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

INSERT INTO `mydb`.`Padre` (`idPadre`, `nombre`) VALUES (1, 'primero');

DELIMITER //
CREATE PROCEDURE proc_IngresarSolicitudFormulario(
npadre_ varchar(45),
nhijo_ varchar(45)
)
 
begin
 
/*Handler para error SQL*/
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
SELECT 'ERROR SQLEXCEPTION' as error;
ROLLBACK;
END;
 
/*Handler para error SQL*/
DECLARE EXIT HANDLER FOR SQLWARNING
BEGIN
SELECT 'ERROR SQLWARNING' as error;
ROLLBACK;
END;
 
START TRANSACTION;
 
select @id_:=idPadre from Padre where nombre like npadre_;
 
INSERT INTO `mydb`.`Hijo`
(
`nombre`,
`Padre_idPadre`)
VALUES
(
nhijo_,
@id_
);
 
 
COMMIT;
 
end
// DELIMITER ;

call proc_IngresarSolicitudFormulario('primero1','luis'); //Resultado OK - Retorna Excepción
call proc_IngresarSolicitudFormulario('primero2','luis'); //Resultado OK - Retorna Excepción
call proc_IngresarSolicitudFormulario('primero','luis');  // Resultado OK - Realiza registro
call proc_IngresarSolicitudFormulario('primero1','luis'); // Resultado !!! - No debería realizar el registro
call proc_IngresarSolicitudFormulario('primero2','luis'); // Resultado !!! - No debería realizar el registro



 Comments   
Comment by Elena Stepanova [ 2015-10-24 ]

pichi009,

If I have guessed the complaint right, you expect the last two procedure calls return SQLEXCEPTION, but they don't.
This is a wrong expectation, though.
The first two calls return exception because they cannot find a value for @id_ in mydb.Padre, so the INSERT attempts to insert NULL into a non-nullable column Padre_idPadre.
But the third call sets the variable to 1, and since then it remains set – its scope is the duration of the session, not the procedure.
So, the last two calls work just fine.

Generated at Thu Feb 08 07:30:14 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.