我使用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代码不正确吗?程序是否正确创建?这是许可问题吗? (我已经授予用户几乎所有权限)任何想法都会受到赞赏,因为我花了几天时间试图解决这个问题。
谢谢!
答案 0 :(得分:0)
MySQL存储过程不返回任何值,但可以在执行后读取存储过程内部的select语句的结果。
但是,您需要一个函数来返回单个值,因此您必须将SQL代码更改为MySQL函数声明:
R CMD INSTALL ...