【问题标题】:Error in calling Stored Procedure(MySql) through Java通过 Java 调用存储过程(MySql)时出错
【发布时间】:2014-11-23 10:07:29
【问题描述】:

我正在创建一个 java 代码来从 mysql Db 调用一个存储过程。 但是当我编译代码时出现以下错误。我附上了代码。我是存储过程的初学者,正在寻求帮助。在此先感谢。 存储过程:

    CREATE DEFINER=`root`@`localhost` PROCEDURE `get_in_out_status_for_manager`(IN id int, OUT date_info date,out empname varchar(35),
        out EmpID varchar(10),
        out CardId Varchar(10),
        out EntryTime Datetime,
        out ExitTime datetime,
        out WorkTime time)
        BEGIN
        SELECT Date,empname,EmpID,CardID,EntryTime,ExitTime,WorkTime from pax_attd
        join employee_master on right(pax_attd.EmpID,3)=employee_master.employee_id
        where ((employee_master.reporting_employee_id=id) and (date=date_info));

        END

        Java Code:

        package mysqltoxl;
        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/PaxWeb";

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

           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_in_out_status_for_manager(?, ?, ?, ?, ?, ?, ?, ?)}";
                  stmt = conn.prepareCall(sql);

                  //Bind IN parameter first, then bind OUT parameter
                  int EmpId = 401;

                  stmt.setInt(1,EmpId);



                  // Because second parameter is OUT so register it

                    stmt.registerOutParameter(2, java.sql.Types.DATE);
                    stmt.registerOutParameter(3, java.sql.Types.VARCHAR);
                    stmt.registerOutParameter(4, java.sql.Types.VARCHAR);
                    stmt.registerOutParameter(5, java.sql.Types.VARCHAR);
                    stmt.registerOutParameter(6, java.sql.Types.TIME);
                    stmt.registerOutParameter(7, java.sql.Types.TIME);
                    stmt.registerOutParameter(8, java.sql.Types.TIME);

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


                    Date Date = stmt.getDate(2);
                    String empname = stmt.getString(3);
                    String EmpID = stmt.getString(4);
                    String CardId = stmt.getString(4);
                    Date EntryTime= stmt.getDate(5);
                    Date ExitTime = stmt.getDate(6);
                    Time WorkTime = stmt.getTime(7); 
                  System.out.println("Emp Name with ID:" + 
                           EmpId + " is " + empname);
                  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

我的错误是:

Connecting to database...
Creating statement...
Executing stored procedure...
Emp Name with ID:401 is null
Goodbye!

【问题讨论】:

    标签: java mysql stored-procedures jdbc


    【解决方案1】:

    更改 out 参数名称并在 select 语句中添加 into 子句。 创建过程如下:

    创建定义器=root@localhost 过程get_in_out_status_for_manager(
    IN id int,
    OUT date_info 日期,
    输出 out_empname varchar(35),
    输出 out_EmpID varchar(10),
    输出 out_CardId Varchar(10),
    out_EntryTime 日期时间,
    输出 out_ExitTime 日期时间,
    out_WorkTime 时间)
    开始
    SELECT Date,empname,EmpID,CardID,EntryTime,ExitTime,WorkTime
    进入 date_info,out_empname,out_EmpID,out_CardID,out_EntryTime,out_ExitTime,out_WorkTime
    来自 pax_attd 加入右边的employee_master(pax_attd.EmpID,3)=employee_master.employee_id 其中 ((employee_master.reporting_employee_id=id) 和 (date=date_info));

        END
    

    【讨论】:

    • out 参数不会将任何值带入过程,但会返回一些值给 java 程序。这里 date_info 是一个 out 参数,用于条件子句。这是问题,请检查一次。
    • 是的,我检查并更改为“IN date_info date”,即使结果是一样的。
    【解决方案2】:

    你忘记放入存储过程了吗?

    CREATE DEFINER=root@localhost PROCEDURE get_in_out_status_for_manager(IN id int, IN date_info date,out empname varchar(35), 出 EmpID varchar(10), 出 CardId Varchar(10), 出 EntryTime 日期时间, 出 ExitTime 日期时间, 工作时间) 开始 SELECT Date,empname,EmpID,CardID,EntryTime,ExitTime,WorkTime INTO DATE_INFO, EMPNAME, EMPID, CARDID, ENTRYTIME, EXITTIME, WORKTIME 从 pax_attd 加入右边的employee_master(pax_attd.EmpID,3)=employee_master.employee_id 其中 ((employee_master.reporting_employee_id=id) 和 (date=date_info));

        END
    

    【讨论】:

    • date_info 应该是 IN 并且您需要在您的 Java 代码中设置它。因为从您的选择查询中,您在 where 子句中使用 date_info 参数。
    • 你已经把它写成 IN 但你在 Java 代码上声明了吗? int EmpId = 401; stmt.setInt(1,EmpId); stmt.java.sql.Date.valueOf(2,"2013-09-04");
    猜你喜欢
    • 2015-12-12
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    • 2016-10-19
    • 2018-02-09
    • 2013-12-18
    • 2018-11-13
    相关资源
    最近更新 更多