从java中的mysql存储过程中获取参数

时间:2022-11-13 11:11:58

I am having problem retrieving OUT parameter from mysql stored procedure in java.

我有问题从java中的mysql存储过程检索OUT参数。

CALL proc_after_topic_add('newtest',@result);
SELECT @result;

this query gives me desired out parameter but how would i retrieve it in java.I tried using CallableStatement but i get

这个查询给了我想要的参数,但我将如何在java中检索它。我尝试使用CallableStatement但我得到了

java.sql.SQLException: Callable statments not supported.

error.Please guys help me. I have tried following

错误。请伙计们帮助我。我试过跟随

String sql = "CALL proc_after_topic_add(?,?);";
            CallableStatement cstmt = conn.prepareCall(sql);
            cstmt.setString(1, topicname);
            cstmt.registerOutParameter(2, java.sql.Types.INTEGER);
            ResultSet rs = cstmt.executeQuery();
            if (rs.next()) {
                if (rs.getInt(1) == 1) {
                    res = 0;
                } else {
                    res = -1;
                }
            }

I havent posted stored procedure code because there is nothing wrong with it.

我没有发布存储过程代码,因为它没有任何问题。

PS:I a using mysql 5.5.21 and yes i should probably mention i am using mysql connector 3.0.15

Okay this is solved.For anyone who encounters the same problem,just download latest version of mysql connector.

好的,这已经解决了。对于遇到同样问题的人,只需下载最新版本的mysql连接器即可。

2 个解决方案

#1


2  

Error in this line

这一行出错

 cstmt.registerOutParameter(2, java.sql.Types.INTEGER);

change like this

像这样改变

 String sql = "CALL proc_after_topic_add(?,?);";
 cstmt.registerOutParameter(2, java.sql.Types.INTEGER);

#2


0  

Create a schema test and create a table employee in schema with 2 columns.  
id and employeename and insert some data.

Use this Stored Procedure.
DELIMITER $$
DROP PROCEDURE IF EXISTS `test`.`get_count_name1` $$
CREATE PROCEDURE  `test`.`get_count_name1`(IN the_name VARCHAR(64),OUT     
the_count INT)

BEGIN
SELECT COUNT(*) INTO the_count from employee where employeename=the_name;
END$$
DELIMITER ;

Use this example. username and password are root and root for me. change as per your
requirement. Here i am counting the occurence of employeename="deepak"

使用此示例。用户名和密码对我来说都是root和root。根据您的要求改变。在这里,我正在计算的雇员名称=“deepak”

import java.sql.*;
public class JDBCExample {
   // JDBC driver name and database URL
   static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
   static final String DB_URL = "jdbc:mysql://localhost/test";

   //  Database credentials
   static final String USER = "root";
   static final String PASS = "root";

   public static void main(String[] args) {
   Connection conn = null;
   CallableStatement stmt = null;
   try{
      //STEP 2: Register JDBC driver
      Class.forName("com.mysql.jdbc.Driver");

      //STEP 3: Open a connection
      System.out.println("Connecting to database...");
      conn = DriverManager.getConnection(DB_URL,USER,PASS);

      //STEP 4: Execute a query
      System.out.println("Creating statement...");
      String sql = "{call get_count_name1 (?, ?)}";
      stmt = conn.prepareCall(sql);

      //Bind IN parameter first, then bind OUT parameter
      String name = "Deepak";
      stmt.setString(1, name); // This would set ID as 102
      // Because second parameter is OUT so register it
      stmt.registerOutParameter(2, java.sql.Types.INTEGER);

      //Use execute method to run stored procedure.
      System.out.println("Executing stored procedure..." );
      stmt.execute();

     int count=stmt.getInt(2);
     System.out.println(count);
      stmt.close();
      conn.close();
   }catch(SQLException se){
      //Handle errors for JDBC
      se.printStackTrace();
   }catch(Exception e){
      //Handle errors for Class.forName
      e.printStackTrace();
   }finally{
      //finally block used to close resources
      try{
         if(stmt!=null)
            stmt.close();
      }catch(SQLException se2){
      }// nothing we can do
      try{
         if(conn!=null)
            conn.close();
      }catch(SQLException se){
         se.printStackTrace();
      }//end finally try
   }//end try
   System.out.println("Goodbye!");
}//end main
}//end JDBCExample

#1


2  

Error in this line

这一行出错

 cstmt.registerOutParameter(2, java.sql.Types.INTEGER);

change like this

像这样改变

 String sql = "CALL proc_after_topic_add(?,?);";
 cstmt.registerOutParameter(2, java.sql.Types.INTEGER);

#2


0  

Create a schema test and create a table employee in schema with 2 columns.  
id and employeename and insert some data.

Use this Stored Procedure.
DELIMITER $$
DROP PROCEDURE IF EXISTS `test`.`get_count_name1` $$
CREATE PROCEDURE  `test`.`get_count_name1`(IN the_name VARCHAR(64),OUT     
the_count INT)

BEGIN
SELECT COUNT(*) INTO the_count from employee where employeename=the_name;
END$$
DELIMITER ;

Use this example. username and password are root and root for me. change as per your
requirement. Here i am counting the occurence of employeename="deepak"

使用此示例。用户名和密码对我来说都是root和root。根据您的要求改变。在这里,我正在计算的雇员名称=“deepak”

import java.sql.*;
public class JDBCExample {
   // JDBC driver name and database URL
   static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
   static final String DB_URL = "jdbc:mysql://localhost/test";

   //  Database credentials
   static final String USER = "root";
   static final String PASS = "root";

   public static void main(String[] args) {
   Connection conn = null;
   CallableStatement stmt = null;
   try{
      //STEP 2: Register JDBC driver
      Class.forName("com.mysql.jdbc.Driver");

      //STEP 3: Open a connection
      System.out.println("Connecting to database...");
      conn = DriverManager.getConnection(DB_URL,USER,PASS);

      //STEP 4: Execute a query
      System.out.println("Creating statement...");
      String sql = "{call get_count_name1 (?, ?)}";
      stmt = conn.prepareCall(sql);

      //Bind IN parameter first, then bind OUT parameter
      String name = "Deepak";
      stmt.setString(1, name); // This would set ID as 102
      // Because second parameter is OUT so register it
      stmt.registerOutParameter(2, java.sql.Types.INTEGER);

      //Use execute method to run stored procedure.
      System.out.println("Executing stored procedure..." );
      stmt.execute();

     int count=stmt.getInt(2);
     System.out.println(count);
      stmt.close();
      conn.close();
   }catch(SQLException se){
      //Handle errors for JDBC
      se.printStackTrace();
   }catch(Exception e){
      //Handle errors for Class.forName
      e.printStackTrace();
   }finally{
      //finally block used to close resources
      try{
         if(stmt!=null)
            stmt.close();
      }catch(SQLException se2){
      }// nothing we can do
      try{
         if(conn!=null)
            conn.close();
      }catch(SQLException se){
         se.printStackTrace();
      }//end finally try
   }//end try
   System.out.println("Goodbye!");
}//end main
}//end JDBCExample