【问题标题】:Stored Procedure call from Java - FUNCTION does not exist?来自 Java 的存储过程调用 - FUNCTION 不存在?
【发布时间】:2018-04-14 03:08:03
【问题描述】:

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

谢谢!

【问题讨论】:

    标签: java mysql stored-procedures


    【解决方案1】:

    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 ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-10
      • 1970-01-01
      • 2013-10-12
      • 2017-06-04
      • 2021-02-11
      • 2013-05-18
      • 2013-11-23
      相关资源
      最近更新 更多