我使用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代码不正确吗?程序创建正确吗?这是权限问题吗? (我已经向用户授予了几乎所有权限)任何想法都将不胜感激,因为我花了几天的时间来尝试解决此问题。

谢谢!

最佳答案

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

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

DELIMITER $$
DROP FUNCTION IF EXISTS `usp_GetEmployeeNo`$$
CREATE FUNCTION `usp_GetEmployeeNo`(i_last_name VARCHAR(30))
RETURNS INT
BEGIN

    declare return_val int default 0;  /* local variable */

    SELECT emp_no
      into return_val  /* <-- */
    FROM employees
    WHERE last_name = i_last_name;

    return return_val;
END$$
DELIMITER ;

关于java - 从Java调用存储过程-功能不存在?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47060956/

10-09 15:13
查看更多