【发布时间】: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