mysql存储过程传入一个参数返回结果集
发布时间:2025-05-13 22:48:14 发布人:远客网络
一、mysql存储过程传入一个参数返回结果集
1、在MySQL中,若要获取存储过程的返回值,可以通过设置一个OUT参数来实现。例如,创建一个名为addvoucher的存储过程:
2、CREATE PROCEDURE addvoucher(IN userid INT, IN voucherid INT, OUT result INT)
3、SELECT@endate_a:= endate,@batch_a:= batch,@c_count_a:= c_count,@isdead_a:= isdead FROM t_voucher WHERE id= voucherid;
4、IF EXISTS(SELECT* FROM t_user_voucher tuv, t_voucher tv WHERE tv.id= tuv.voucherid AND tv.batch=@batch_a) THEN
5、IF(TO_DAYS(@endate_a)- TO_DAYS(NOW()))> 0 THEN
6、上述代码段中,我们首先通过SELECT语句查询t_voucher表中的相关信息,并将结果存储到变量中。接着,我们设置autocommit为0,以便进行事务管理。然后,通过IF EXISTS语句检查t_user_voucher表和t_voucher表之间的关联是否存在。如果存在,则将result设置为1并返回结果。如果不存在,则进一步检查c_count_a是否大于0,并判断endate_a是否在当前日期之后。根据不同的条件,result的值会有所不同,最终返回给调用者。
7、在实际应用中,这样的存储过程可以用于验证用户是否可以使用某个优惠券,或者检查优惠券的有效性等场景。通过设置OUT参数,我们能够将存储过程的结果传递给调用者,以便进一步处理。
8、在使用存储过程时,需要注意事务的管理和错误处理。通过设置autocommit为0,我们可以更好地控制事务的提交。同时,合理地使用IF语句和CASE语句,可以简化逻辑判断,提高代码的可读性和可维护性。
9、此外,为了确保数据的一致性和完整性,建议在存储过程中使用适当的事务控制语句,如BEGIN、COMMIT和ROLLBACK等。这些语句可以帮助我们更好地管理事务,避免数据丢失或不一致的情况。
10、总之,通过设置OUT参数,我们可以从存储过程中获取返回值。这在处理复杂的业务逻辑时非常有用,可以提高代码的可读性和可维护性,同时确保数据的一致性和完整性。
二、java如何获得mysql存储过程的返回值
本概述是从《JDBCTM Database Access from JavaTM: A Tutorial and Annotated Reference》这本书中摘引来的。JavaSoft目前正在准备这本书。这本书是一本教程,同时也是 JDBC的重要参考手册,它将作为 Java系列的组成部份在 1997年春季由 Addison-Wesley出版公司出版。
CallableStatement对象为所有的 DBMS提供了一种以标准形式调用已储存过程的方法。已储存过程储存在数据库中。对已储存过程的调用是 CallableStatement对象所含的内容。这种调用是用一种换码语法来写的,有两种形式:一种形式带结果参数,另一种形式不带结果参数(有关换码语法的信息,参见第 4节“语句”)。结果参数是一种输出(OUT)参数,是已储存过程的返回值。两种形式都可带有数量可变的输入(IN参数)、输出(OUT参数)或输入和输出(INOUT参数)的参数。问号将用作参数的占位符。
在 JDBC中调用已储存过程的语法如下所示。注意,方括号表示其间的内容是可选项;方括号本身并不是语法的组成部份。
不带参数的已储存过程的语法类似:
通常,创建 CallableStatement对象的人应当知道所用的 DBMS是支持已储存过程的,并且知道这些过程都是些什么。然而,如果需要检查,多种 DatabaseMetaData方法都可以提供这样的信息。例如,如果 DBMS支持已储存过程的调用,则 supportsStoredProcedures方法将返回 true,而 getProcedures方法将返回对已储存过程的描述。
CallableStatement继承 Statement的方法(它们用于处理一般的 SQL语句),还继承了 PreparedStatement的方法(它们用于处理 IN参数)。CallableStatement中定义的所有方法都用于处理 OUT参数或 INOUT参数的输出部分:注册 OUT参数的 JDBC类型(一般 SQL类型)、从这些参数中检索结果,或者检查所返回的值是否为 JDBC NULL。
7.1.1创建 CallableStatement对象
CallableStatement对象是用 Connection方法 prepareCall创建的。下例创建 CallableStatement的实例,其中含有对已储存过程 getTestData调用。该过程有两个变量,但不含结果参数:
CallableStatement cstmt= con.prepareCall(
其中?占位符为 IN、 OUT还是 INOUT参数,取决于已储存过程 getTestData。
将 IN参数传给 CallableStatement对象是通过 setXXX方法完成的。该方法继承自 PreparedStatement。所传入参数的类型决定了所用的 setXXX方法(例如,用 setFloat来传入 float值等)。
如果已储存过程返回 OUT参数,则在执行 CallableStatement对象以前必须先注册每个 OUT参数的 JDBC类型(这是必需的,因为某些 DBMS要求 JDBC类型)。注册 JDBC类型是用 registerOutParameter方法来完成的。语句执行完后,CallableStatement的 getXXX方法将取回参数值。正确的 getXXX方法是为各参数所注册的 JDBC类型所对应的 Java类型(从 JDBC类型到 Java类型的标准映射见 8.6.1节中的表)。换言之, registerOutParameter使用的是 JDBC类型(因此它与数据库返回的 JDBC类型匹配),而 getXXX将之转换为 Java类型。
作为示例,下述代码先注册 OUT参数,执行由 cstmt所调用的已储存过程,然后检索在 OUT参数中返回的值。方法 getByte从第一个 OUT参数中取出一个 Java字节,而 getBigDecimal从第二个 OUT参数中取出一个 BigDecimal对象(小数点后面带三位数):
CallableStatement cstmt= con.prepareCall(
cstmt.registerOutParameter(1, java.sql.Types.TINYINT);
cstmt.registerOutParameter(2, java.sql.Types.DECIMAL, 3);
java.math.BigDecimal n= cstmt.getBigDecimal(2, 3);
CallableStatement与 ResultSet不同,它不提供用增量方式检索大 OUT值的特殊机制。
既支持输入又接受输出的参数(INOUT参数)除了调用 registerOutParameter方法外,还要求调用适当的 setXXX方法(该方法是从 PreparedStatement继承来的)。setXXX方法将参数值设置为输入参数,而 registerOutParameter方法将它的 JDBC类型注册为输出参数。setXXX方法提供一个 Java值,而驱动程序先把这个值转换为 JDBC值,然后将它送到数据库中。
这种 IN值的 JDBC类型和提供给 registerOutParameter方法的 JDBC类型应该相同。然后,要检索输出值,就要用对应的 getXXX方法。例如,Java类型为 byte的参数应该使用方法 setByte来赋输入值。应该给 registerOutParameter提供类型为 TINYINT的 JDBC类型,同时应使用 getByte来检索输出值(第 8节“JDBC和 Java类型之间的映射”将给出详细信息和类型映射表)。
下例假设有一个已储存过程 reviseTotal,其唯一参数是 INOUT参数。方法 setByte把此参数设为 25,驱动程序将把它作为 JDBC TINYINT类型送到数据库中。接着,registerOutParameter将该参数注册为 JDBC TINYINT。执行完该已储存过程后,将返回一个新的 JDBC TINYINT值。方法 getByte将把这个新值作为 Java byte类型检索。
CallableStatement cstmt= con.prepareCall(
cstmt.registerOutParameter(1, java.sql.Types.TINYINT);
7.1.4先检索结果,再检索 OUT参数
由于某些 DBMS的限制,为了实现最大的可移植性,建议先检索由执行 CallableStatement对象所产生的结果,然后再用 CallableStatement.getXXX方法来检索 OUT参数。
如果 CallableStatement对象返回多个 ResultSet对象(通过调用 execute方法),在检索 OUT参数前应先检索所有的结果。这种情况下,为确保对所有的结果都进行了访问,必须对 Statement方法 getResultSet、getUpdateCount和 getMoreResults进行调用,直到不再有结果为止。
检索完所有的结果后,就可用 CallableStatement.getXXX方法来检索 OUT参数中的值。
7.1.5检索作为 OUT参数的 NULL值
返回到 OUT参数中的值可能会是 JDBC NULL。当出现这种情形时,将对 JDBC NULL值进行转换以使 getXXX方法所返回的值为 null、0或 false,这取决于 getXXX方法类型。对于 ResultSet对象,要知道 0或 false是否源于 JDBC NULL的唯一方法,是用方法 wasNull进行检测。如果 getXXX方法读取的最后一个值是 JDBC NULL,则该方法返回 true,否则返回 flase。
三、mybatis调用mysql存储过程(返回参数,单结果集,多结果集)
mybatis调用mysql存储过程(返回参数,单结果集,多结果集)
注: RETCODE、RETDESC这里的输出值不用在函数里 SELECT RETCODE;,因为即使没有,当执行成功后会自动返回在对象里(Object/Map),所以在函数里不用SELECT一下了。
Navicat中执行函数需要输入参数值,也是对应图1,@A@B表示输出值。(一个输入值两个输出值)
1.标注一二三四五处如果存在,则执行成功后返回结果如下
存在这么多结果,想要取结果3中的集合是不好取的,只有像下图一样只有一个结果才好取出集合。
2.标注一二四五处如果不存在,则执行成功后返回结果如下
只有结果1,对应的是标注三处的值。可以取出集合