【问题标题】:Showing parameter number 2 is not an OUT parameter while calling a procedure using java使用 java 调用过程时显示参数号 2 不是 OUT 参数
【发布时间】:2016-12-21 04:39:06
【问题描述】:

我正在尝试使用 java 调用存储过程。

我是存储过程的初学者。 所以先在 mysql 终端中尝试了同样的方法

mysql> delimiter // 
mysql> create procedure get_EmployeeName(IN cust_id INT,OUT cust_name varchar(20)) 
    -> begin 
    -> select name into cust_name from CUSTOMERS where id = cust_id; 
    -> end // 
Query OK, 0 rows affected (0.11 sec) 

mysql> delimiter ; 
mysql> call get_EmployeeName(1,@cust_name); 
Query OK, 1 row affected (0.08 sec) 
mysql> select @cust_name; 
+------------+ 
| @cust_name | 
+------------+ 
| A          | 
+------------+ 
1 row in set (0.01 sec) 

我能够得到输出。

现在尝试使用 Java。

创建过程语句

stmt.execute("create procedure mydb.WhoAreThey(IN id INT, OUT name VARCHAR(20)) begin select Name into name from employees where EmployeeID = id; end");

程序调用

不确定我的过程调用是对还是错

        String IN = "1000";
        cs = con.prepareCall("{call WhoAreThey(?,?)}");
        cs.setString(1, IN);
        cs.registerOutParameter(2, Types.VARCHAR);
        cs.execute();

上面的调用给出了一个 sqlexception “SQLException:参数号 2 不是 OUT 参数”

更新

通过调用 "cs = con.prepareCall("{call mydb.WhoAreThey(?,?)}");"来工作

但是当我这样做时 select @name..它显示“Null”。

由于 EmployeeID 为 1000,我希望我在员工表中的输出为“David Walker”。

mysql> select * from employees;
+------------+--------------+--------+---------------------+
| EmployeeID | Name         | Office | CreateTime          |
+------------+--------------+--------+---------------------+
|       1000 | David Walker | HQ101  | 2016-12-21 13:00:37 |
|       1001 | Paul Martin  | HQ101  | 2016-12-21 13:00:37 |
+------------+--------------+--------+---------------------+
2 rows in set (0.00 sec)

我检查的方式是否错误(选择@name)

【问题讨论】:

  • 您确定存储过程已创建吗?
  • @shmosel:是的,它被创建了。使用 show procedure status 进行检查。在那里我可以看到“WhoAreThey”作为 1 个条目
  • 您的第一个参数是整数,并且您正在将字符串设置到其中。有问题吗?
  • @PVR:将字符串更改为 int。但仍然显示相同的错误 (int IN = 1; cs = con.prepareCall("{call WhoAreThey(?,?)}"); cs.setInt(1, IN); cs.registerOutParameter(2, Types.VARCHAR) ;)
  • 尝试通过 mydb.WhoAreThey 调用 procudure。

标签: java mysql stored-procedures


【解决方案1】:

而不是调用 WhoAreThey 调用 mydb.WhoAreThey

 String IN = "1000";
    cs = con.prepareCall("{call mydb.WhoAreThey(?,?)}");
    cs.setString(1, IN);
    cs.registerOutParameter(2, Types.VARCHAR);
    cs.execute();

获取 OUT 参数 USE 的值:

String name = cs.getString(2);

【讨论】:

  • 输出一个空值。我的程序是否正确?
  • 具有不同名称的相同程序 get_EmployeeName 工作正常吗?
  • 是的,工作正常。我将表从 CUSTOMERS 更改为 java 程序的员工
猜你喜欢
  • 2013-10-23
  • 1970-01-01
  • 2020-11-08
  • 2023-03-25
  • 2018-05-04
  • 1970-01-01
  • 1970-01-01
  • 2011-03-02
  • 2012-09-27
相关资源
最近更新 更多