来自Java的存储过程调用 - FUNCTION不存在?

时间:2017-11-01 17:58:05

标签: java mysql stored-procedures

我使用MySQL员工演示数据库创建了一个非常简单的存储过程,该数据库应该返回一个值:

CREATE DEFINER=`root`@`localhost` PROCEDURE `usp_GetEmployeeNo`(IN i_last_name VARCHAR(16))
BEGIN
SELECT emp_no FROM employees WHERE last_name = i_last_name;
END$$
DELIMITER ;

我试图从像这样的java程序中调用这个过程:

package test_mysql_demo_sp;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.CallableStatement;
import java.sql.Types;
import java.sql.ResultSet;

public class Test_mysql_demo_sp {

    public static void main(String[] args) {

        Connection conn = null;
        String jdbcUrl;
        jdbcUrl = "jdbc:mysql://localhost:3306/employees";
        String username = "TestUser";
        String password = "abc123";
        try {
            conn = DriverManager.getConnection(jdbcUrl, username, password);

            CallableStatement cStmt = conn.prepareCall("{?= call usp_GetEmployeeNo(?)}");
            cStmt.registerOutParameter(1, Types.INTEGER);
            cStmt.setString(2, "Smith");
            cStmt.execute();       
            System.out.println(cStmt.getInt(1));
            cStmt.close();

        } catch (SQLException ex) {
            // handle any errors
            System.out.println("SQLException: " + ex.getMessage());
            System.out.println("SQLState: " + ex.getSQLState());
            System.out.println("VendorError: " + ex.getErrorCode());
        }

    }

}

但是,我收到以下错误:

SQLException: FUNCTION employees.usp_GetEmployeeNo does not exist
SQLState: 42000
VendorError: 1305

我可以使用同一个用户从MySQL工作台调用该过程,它返回的值就好了。 java代码不正确吗?程序是否正确创建?这是许可问题吗? (我已经授予用户几乎所有权限)任何想法都会受到赞赏,因为我花了几天时间试图解决这个问题。

谢谢!

1 个答案:

答案 0 :(得分:0)

MySQL存储过程不返回任何值,但可以在执行后读取存储过程内部的select语句的结果。

但是,您需要一个函数来返回单个值,因此您必须将SQL代码更改为MySQL函数声明:

R CMD INSTALL ...