usar stored preparecall como java mysql stored-procedures jdbc callable-statement

stored - preparecall java oracle



No puedo recuperar el valor que deseaba seleccionar mediante el procedimiento almacenado (2)

Estoy tratando de encontrar un registro. Lo que me permite elegir buscar un registro existente en mi base de datos utilizando Stored Procedure. Cuando traté de buscar datos existentes, no me da el valor que quiero. Cuando presiono el botón de búsqueda no imprime el valor del campo de texto.

CÓDIGO

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { String searchSection = Section_SearchSection_Textfield.getText(); String searchSection_Name = Section_SectionName_TextField.getText(); int sectionID = 0; if (searchSection.isEmpty()) { JOptionPane.showMessageDialog(null, "Please fill up this fields"); } else try (Connection myConn = DBUtil.connect()) { try (CallableStatement myFirstCs = myConn.prepareCall("{call getSECTION_NAME(?,?)}")) { myFirstCs.setInt(1, sectionID);// I set the ID for Primary Key myFirstCs.registerOutParameter(2, Types.VARCHAR); myFirstCs.setString(2, searchSection_Name); boolean hasresults = myFirstCs.execute(); if (hasresults) { try (ResultSet myRs = myFirstCs.getResultSet()) { int resultsCounter = 0; while (myRs.next()) { sectionID = myRs.getInt("SECTION_ID"); String sectionName = myRs.getString(2); Section_SectionName_TextField.setText(sectionName);//Set the value of text Section_SectionName_TextField.setEnabled(true);//Set to enable resultsCounter++; }//end of while }//end of if }//end of resultset }//end of callablestatement }//end of connection catch (SQLException e) { DBUtil.processException(e); } }

Procedimiento almacenado

CREATE PROCEDURE getSECTION_NAME(IN ID INT, OUT NAME VARCHAR(50)) SELECT * FROM allsections_list WHERE SECTION_ID = ID AND SECTION_NAME = NAME

Mesa

CREATE TABLE ( SECTION_ID INT PRIMARY KEY AUTO_INCREMENT, SECTION_NAME VARCHAR(50) NOT NULL )

¡Cualquier ayuda sería apreciada! ¡Gracias!

¡Actualizar! De acuerdo con lo que leí, Stored Procedure puede devolver un conjunto de resultados. Quiero recuperar los valores del parámetro OUT.

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { String searchSection = Section_SearchSection_Textfield.getText(); String searchSection_Name = Section_SectionName_TextField.getText(); if (searchSection.isEmpty()) { JOptionPane.showMessageDialog(null, "Please fill up this fields"); } else try (Connection myConn = DBUtil.connect(); CallableStatement myFirstCs = myConn.prepareCall("{call getSECTION_NAME(?,?)}")) { myFirstCs.setInt(1, sectionID);// I set the ID for Primary Key myFirstCs.registerOutParameter(2, Types.VARCHAR); boolean hasresults = myFirstCs.execute(); if (hasresults) { try (ResultSet myRs = myFirstCs.getResultSet()) { while (myRs.next()) { sectionID = myRs.getInt("SECTION_ID"); System.out.print(sectionID); }//end of while }//end of resultset }//end of if String sectionName = myFirstCs.getString(2); Section_SectionName_TextField.setText(sectionName);//Set the value of text Section_SectionName_TextField.setEnabled(true);//Set to enable System.out.print(sectionName); }//end of connection catch (SQLException e) { DBUtil.processException(e); } }

String sectionName = myRs.getString(2); Section_SectionName_TextField.setText(sectionName); Section_SectionName_TextField.setEnabled(true); el String sectionName = myRs.getString(2); Section_SectionName_TextField.setText(sectionName); Section_SectionName_TextField.setEnabled(true); String sectionName = myRs.getString(2); Section_SectionName_TextField.setText(sectionName); Section_SectionName_TextField.setEnabled(true); fuera del bloque Conjunto de resultados y colóquelo en el bloque de Estado llamable. Cuando ejecuto el programa. Los únicos cambios son el campo de texto habilitado y me imprime un valor "nulo".

2da actualización! Quiero devolver los valores del parámetro OUT. No debería usar Result Set para recuperarlo. Así que utilicé el parámetro Callable Statement con el parámetro OUT del procedimiento almacenado de acuerdo con @Gord Thompson.

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { String searchSection = Section_SearchSection_Textfield.getText(); String searchSection_Name = Section_SectionName_TextField.getText(); if (searchSection.isEmpty()) { JOptionPane.showMessageDialog(null, "Please fill up this fields"); } else try (Connection myConn = DBUtil.connect(); CallableStatement myFirstCs = myConn.prepareCall("{call getSECTION_NAME(?,?)}")) { myFirstCs.setInt(1, 2);// I set the ID for Primary Key myFirstCs.registerOutParameter(2, Types.VARCHAR); myFirstCs.execute(); String sectionName = myFirstCs.getString(2); // retrieve value from OUT parameter Section_SectionName_TextField.setText(sectionName);//Set the value of text Section_SectionName_TextField.setEnabled(true);//Set to enable System.out.println(sectionName); }//end of connection catch (SQLException e) { DBUtil.processException(e); } }

Aún me da valores nulos donde no sé por qué obtengo este valor.

Los únicos cambios en mi GUI es que el campo de texto se habilita y no está imprimiendo el valor que quiero en el siguiente campo de texto. :(

Gracias por responder. Siéntete libre de comentar


debe usar delimiter para cambiar el delimitador a algo diferente de ";" cuando creas el procedimiento:

delimiter // CREATE PROCEDURE getSECTION_NAME(IN ID INT, OUT NAME VARCHAR(50)) BEGIN SELECT SECTION_NAME INTO NAME FROM allsections_list WHERE SECTION_ID = ID; END // delimiter ;

La primera instrucción de delimiter establece el delimitador en "//". De esta manera, el ";" en su código de procedimiento almacenado ya no se interpreta como un delimitador. Su instrucción CREATE PROCEDURE luego termina correctamente en "//". Aftwerwards, la segunda instrucción de delimiter cambia el delimitador de nuevo a ";".


Si desea el valor que se devuelve mediante un parámetro OUT de un procedimiento almacenado, entonces no usa un ResultSet, usa el parámetro CallableStatement asociado con el parámetro OUT del procedimiento almacenado. Por ejemplo, para la tabla de prueba

CREATE TABLE `allsections_list` ( `SECTION_ID` int(11) NOT NULL, `SECTION_NAME` varchar(50) DEFAULT NULL, PRIMARY KEY (`SECTION_ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8

que contiene los datos de muestra

SECTION_ID SECTION_NAME ---------- --------------- 1 one_section 2 another_section

y el procedimiento almacenado

CREATE PROCEDURE `getSECTION_NAME`(IN myID INT, OUT myName VARCHAR(50)) BEGIN SELECT SECTION_NAME INTO myName FROM allsections_list WHERE SECTION_ID = myID; END

luego el siguiente código Java

try (CallableStatement myFirstCs = conn.prepareCall("{call getSECTION_NAME(?,?)}")) { myFirstCs.setInt(1, 2); // set IN parameter "myID" to value 2 myFirstCs.registerOutParameter(2, Types.VARCHAR); myFirstCs.execute(); String sectionName = myFirstCs.getString(2); // get value from OUT parameter "myName" System.out.println(sectionName); }

huellas dactilares

another_section