从MySQL服务器5.0版在使用连接器/ J 3.1.1或更新java.sql.CallableStatement
接口是完全实现的异常getParameterMetaData ()
方法。
在MySQL存储过程的更多信息,请参阅使用存储的例程。
连接器/ J暴露通过JDBC的存储过程的功能CallableStatement
接口。
当前版本的MySQL服务器不返回结果集JDBC驱动程序提供足够的信息元数据可调用语句。这意味着,当使用CallableStatement
,ResultSetMetaData
可能会返回零
。
下面的示例显示了一个存储过程返回的值inOutParam
增加了1,使用传入的字符串inputParam
作为一个结果集
:
示例6.3连接器/ J:调用存储过程
创建过程demoSp(在inputParam VARCHAR (255), \ INOUT inOutParam INT)开始宣布z INT;设置z = inOutParam + 1;设置inOutParam = z;选择inputParam;选择CONCAT (zyxw, inputParam);结束
使用demoSp
过程与连接器/ J,遵循这些步骤:
可调用语句使用做好准备
Connection.prepareCall ()
。请注意,您必须使用JDBC转义语法,和周围的括号参数占位符不是可选:
示例6.4连接器/ J:使用
Connection.prepareCall ()
进口java.sql.CallableStatement;…/ / / /准备调用存储过程“demoSp”与两个参数/ / / / / /注意JDBC-escape语法的使用({…})/ / CallableStatement cStmt = conn.prepareCall(“{叫demoSp (?,)}”);cStmt。setString(1,“英语字母”);
请注意Connection.prepareCall ()
是一个昂贵的方法,由于司机执行支持的元数据检索输出参数。由于性能的原因,减少不必要的调用Connection.prepareCall ()
通过重用CallableStatement
代码中的实例。寄存器的输出参数(如果存在)
检索的值指定为输出参数(参数
出
或INOUT
当你创建的存储过程)、JDBC要求他们使用各种被指定在执行语句之前registerOutputParameter ()
方法CallableStatement
接口:示例6.5连接器/ J:注册输出参数
进口java.sql.Types;…/ / / /连接器/ J支持命名和索引/ /输出参数。你可以注册输出/ /参数使用方法,/ /因为检索输出参数使用/ /方法,不管什么方法/ /用于注册。/ / / /下面的例子展示如何使用/ /注册/ /输出参数的各种方法(当然你应该/ /每个参数只使用一个注册)。/ / / / / /注册第二个参数作为输出,和/或使用的整数类型的值/ / getObject () / / cStmt归来。Types.INTEGER registerOutParameter (2);/ / / /注册命名参数“inOutParam”,和/或使用的整数类型的值/ / getObject () / / cStmt归来。registerOutParameter (“inOutParam”, Types.INTEGER);…
设置输入参数(如果存在)
输入/输出参数设置为
PreparedStatement
对象。然而,CallableStatement
还支持设置参数的名字:示例6.6连接器/ J:设置
CallableStatement
输入参数…/ / / /设置一个参数通过索引/ / cStmt。setString(1,“英语字母”);/ / / /或者,设置一个参数使用/ / / / cStmt参数名称。setString (“inputParam”、“英语字母”);/ / / / /设置”“使用索引/ / cStmt参数。setInt (2, 1);/ / / /或者,设置“在/参数/ /名称/ / cStmt。setInt (" inOutParam ", 1);…
执行
CallableStatement
和检索结果集或输出参数。虽然
CallableStatement
支持调用的任何声明
执行方法(executeUpdate ()
,executeQuery ()
或execute ()
),最灵活的方法调用execute ()
,你不需要知道提前如果存储过程返回结果集:示例6.7连接器/ J:检索结果和输出参数值
…布尔hadResults = cStmt.execute ();/ / / / / /同时处理所有返回结果集(hadResults) {ResultSet rs = cStmt.getResultSet ();/ /处理结果集…hadResults = cStmt.getMoreResults ();}/ / / / / / / /连接器/检索输出参数J同时支持基于索引和基于名称/ /检索/ / int outputValue = cStmt.getInt (2);/ /基于索引outputValue = cStmt.getInt (“inOutParam”);/ /基于名称…