我使用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/