O que tem e errado com o meu Stored Procedure?

Olá. No meu banco de dados tem um Stored Procedure assim:

delimiter $$
create procedure criar_evento(nome varchar(20), usuario mediumint, inicia date, termina date, feito boolean, constante boolean)
begin
insert into eventos values(default, @nome, @usuario, @inicia, @termina, @feito, @constante);
select id from eventos where nome=@nome and usuario=usuario;
end$$
delimiter ;

A estrutura da tabela eventos é a seguinte:

Porém quando eu chamo esse Stored Procedure pelo Java:

public static long makeEvt(Event evt) throws SQLException{
	Methods.verifyConnection();
	final String query = "CALL criar_evento(?,?,?,?,?,?)";
	PreparedStatement st = (PreparedStatement) UserDAO.getConnection().prepareStatement(query);
	st.setString(1, evt.getName());
	st.setLong(2, UserDAO.getCurrentUser().getId());
	st.setDate(3, java.sql.Date.valueOf(new String(evt.getYear()+"-"+evt.getMonth()+"-"+evt.getDay())));
	st.setDate(4, java.sql.Date.valueOf(new String(evt.getYear2()+"-"+evt.getMonth2()+"-"+evt.getDay2())));
	st.setBoolean(5, evt.isDone());
	st.setBoolean(6, evt.isConstant());
	long toReturn = 0;
	ResultSet rs = st.executeQuery();
	while(rs.next()){
		toReturn = rs.getLong(1);
	}
	rs.close();
	return toReturn;
}

Eu recebo a seguinte exceção:

java.sql.SQLIntegrityConstraintViolationException: Column 'evento' cannot be null
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:533)
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:513)
	at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:115)
	at com.mysql.cj.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:1983)
	at com.mysql.cj.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1826)
	at com.mysql.cj.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1923)
	at com.tkfentretenimento.meusdados.model.ItemDAO.makeEvt(ItemDAO.java:171)
	at com.tkfentretenimento.meusdados.controller.MainWindow.makeEvt(MainWindow.java:719)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at sun.reflect.misc.Trampoline.invoke(Unknown Source)
	at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at sun.reflect.misc.MethodUtil.invoke(Unknown Source)
	at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1771)
	at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657)
	at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
	at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
	at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
	at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
	at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
	at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
	at javafx.event.Event.fireEvent(Event.java:198)
	at javafx.scene.Node.fireEvent(Node.java:8413)
	at javafx.scene.control.Button.fire(Button.java:185)
	at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182)
	at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96)
	at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89)
	at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
	at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
	at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
	at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
	at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
	at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
	at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
	at javafx.event.Event.fireEvent(Event.java:198)
	at javafx.scene.Scene$MouseHandler.process(Scene.java:3757)
	at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
	at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
	at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
	at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:381)
	at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)
	at java.security.AccessController.doPrivileged(Native Method)
	at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:417)
	at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
	at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:416)
	at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
	at com.sun.glass.ui.View.notifyMouse(View.java:937)
	at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
	at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
	at java.lang.Thread.run(Unknown Source)

ItemDAO.java:171 = ResultSet rs = st.executeQuery();
Obs: Eu já verifiquei, não existe nenhum parâmetro nulo no método, tudo indica que o erro está ocorrendo no Stored Procedure

Adicionando IN a declaração de cada atributo resolveu aqui.

Minha procedure ficou assim:

delimiter $$
create procedure criar_evento(IN nome varchar(45), IN usuario mediumint, IN inicia date,
IN termina date, IN feito boolean, IN constante boolean)
begin
insert into eventos values(default, nome, usuario, inicia, termina, feito, constante);
select id from eventos where evento=nome and usuario=usuario;
end$$
delimiter ;

OBS.: o select precisa ser ajustado, não tem coluna nome na tabela

Aqui não resolveu. Mas pra que serve o IN?

E no que isso interfere? “Nome” é só um parâmetro, em nenhum momento do código eu utilizei a coluna nome, e sim o parâmetro nome.

@Thallysson:

Aqui não resolveu. Mas pra que serve o IN?

Opa, o IN só indica que é parâmetro com informação a ser usada dentro da procedure, mas, na verdade, é opcional. Mal ae. Mas o código funcionou aqui, testei novamente. Meu script está abaixo:

delimiter $$
create procedure criar_evento(nome varchar(45), usuario mediumint, inicia date,
termina date, feito boolean, constante boolean)
begin
insert into eventos values(default, nome, usuario, inicia, termina, feito, constante);
select id from eventos where evento=nome and usuario=usuario;
end$$
delimiter ;

@Thallysson:

E no que isso interfere? “Nome” é só um parâmetro, em nenhum momento do código eu utilizei a coluna nome, e sim o parâmetro nome.

No seu script, ‘nome’ não é só parâmetro! Revise seu código!

1 curtida

Me desculpe. Foi falta de atenção minha realmente. Fiquei meio confuso porque os nomes se repetem bastante :joy:. Muito obrigado por me mostrar o erro. Mas sobre a exceção, mesmo corrigindo isso e utilizando o IN, ela não muda.

Tem outra ideia do que pode estar gerando essa exceção?

Resolvi o problema. Eu removi todos os @ da frente das referências aos parâmetros e na declaração deles também, e o erro sumiu. De qualquer forma, valeu pela ajuda.