调用DB2数据库的存储过程:
DB2存储过程代码如下:
//创建一个求两个整数和的存储过程
CREATE PROCEDURE db2admin.SUM(IN p_p1 INT, IN p_p2 INT, OUT p_sum INT)
LANGUAGE SQL
SPECIFIC SUM_ab
DYNAMIC RESULT SETS 1
p1:BEGIN
set p_sum = p_p1 + p_p2;
END p1
JAVA调用存储过程的代码如下(部分):
//连接DB2数据库所需参数
private static final String DB2DRIVER = "com.ibm.db2.jcc.DB2Driver";
private static final String DBURL = "jdbc:db2://localhost:50000/MYDB";
private static final String USER = "db2admin";
private static final String PASSWORD = "ABC123abc";
//...
//具体连接和调用存储过程实现
Connection conn = null;
try {
Class.forName(DB2DRIVER);
conn = DriverManager.getConnection(DBURL, USER, PASSWORD);
//CALL PROCEDURE DB2ADMIN.SUM(INT,INT,?)
String sql = "CALL DB2ADMIN.SUM(?,?,?)";
CallableStatement cs = conn.prepareCall(sql);
cs.setInt(1,2);
cs.setInt(2,3);
cs.registerOutParameter(3,Types.INTEGER);//指明OUT参数的类型
cs.execute();
int sum = cs.getInt(3); //获取OUT参数的信息
System.out.println("sum(2,3)="+ sum);
} catch(Exception e) {
if(conn != null) {
try {
conn.rollback();
}catch(Exception xe) {
System.out.println(xe); }
}
System.out.println(e);
} finally {
try {
if(conn != null) {
conn.close();
conn = null;
}
}catch(Exception ye) {
System.out.println(ye);
}
}
}
CallableStatement接口的说明:
public interface CallableStatementextends PreparedStatement
用于执行 SQL 存储过程的接口。JDBC API 提供了一个存储过程 SQL 转义语法,该语法允许对所有 RDBMS 使用标准方式调用存储过程。此转义语法有一个包含结果参数的形式和一个不包含结果参数的形式。如果使用结果参数,则必须将其注册为 OUT 参数。其他参数可用于输入、输出或同时用于二者。参数是根据编号按顺序引用的,第一个参数的编号是 1。
{?= call <procedure-name>[(<arg1>,<arg2>, ...)]}
{call <procedure-name>[(<arg1>,<arg2>, ...)]}
IN 参数值是使用继承自 PreparedStatement 的 set 方法设置的。在执行存储过程之前,必须注册所有 OUT 参数的类型;它们的值是在执行后通过此类提供的 get 方法获取的。
CallableStatement 可以返回一个 ResultSet 对象或多个 ResultSet 对象。多个 ResultSet 对象是使用继承自 Statement 的操作处理的。
为了获得最大的可移植性,某一调用的 ResultSet 对象和更新计数应该在获得输出参数的值之前处理。
Types类的说明:
public class Typesextends Object
定义用于标识一般 SQL 类型(称为 JDBC 类型)的常量的类。
此类永远是不可序列化的
字段摘要:
BIT
public static final int BIT标识一般 SQL 类型 BIT 的 Java 编程语言中的常量(有时称为类型代码)。
----------------------------------------------------------------------
TINYINT
public static final int TINYINT标识一般 SQL 类型 TINYINT 的 Java 编程语言中的常量(有时称为类型代码)。
----------------------------------------------------------------------
SMALLINT
public static final int SMALLINT标识一般 SQL 类型 SMALLINT 的 Java 编程语言中的常量(有时称为类型代码)。
----------------------------------------------------------------------
INTEGER
public static final int INTEGER标识一般 SQL 类型 INTEGER 的 Java 编程语言中的常量(有时称为类型代码)。
----------------------------------------------------------------------
BIGINT
public static final int BIGINT标识一般 SQL 类型 BIGINT 的 Java 编程语言中的常量(有时称为类型代码)。
----------------------------------------------------------------------
FLOAT
public static final int FLOAT标识一般 SQL 类型 FLOAT 的 Java 编程语言中的常量(有时称为类型代码)。
----------------------------------------------------------------------
REAL
public static final int REAL标识一般 SQL 类型 REAL 的 Java 编程语言中的常量(有时称为类型代码)。
----------------------------------------------------------------------
DOUBLE
public static final int DOUBLE标识一般 SQL 类型 DOUBLE 的 Java 编程语言中的常量(有时称为类型代码)。
----------------------------------------------------------------------
NUMERIC
public static final int NUMERIC标识一般 SQL 类型 NUMERIC 的 Java 编程语言中的常量(有时称为类型代码)。
----------------------------------------------------------------------
DECIMAL
public static final int DECIMAL标识一般 SQL 类型 DECIMAL 的 Java 编程语言
----------------------------------------------------------------------
CHAR
public static final int CHAR标识一般 SQL 类型 CHAR 的 Java 编程语言中的常量(有时称为类型代码)。
----------------------------------------------------------------------
VARCHAR
public static final int VARCHAR标识一般 SQL 类型 VARCHAR 的 Java 编程语言中的常量(有时称为类型代码)。
----------------------------------------------------------------------
LONGVARCHAR
public static final int LONGVARCHAR标识一般 SQL 类型 LONGVARCHAR 的 Java 编程语言中的常量(有时称为类型代码)。
----------------------------------------------------------------------
DATE
public static final int DATE标识一般 SQL 类型 DATE 的 Java 编程语言中的常量(有时称为类型代码)。
----------------------------------------------------------------------
TIME
public static final int TIME标识一般 SQL 类型 TIME 的 Java 编程语言中的常量(有时称为类型代码)。
----------------------------------------------------------------------
TIMESTAMP
public static final int TIMESTAMP标识一般 SQL 类型 TIMESTAMP 的 Java 编程语言中的常量(有时称为类型代码)。
----------------------------------------------------------------------
BINARY
public static final int BINARY标识一般 SQL 类型 BINARY 的 Java 编程语言中的常量(有时称为类型代码)。
----------------------------------------------------------------------
VARBINARY
public static final int VARBINARY标识一般 SQL 类型 VARBINARY 的 Java 编程语言中的常量(有时称为类型代码)。
----------------------------------------------------------------------
LONGVARBINARY
public static final int LONGVARBINARY标识一般 SQL 类型 LONGVARBINARY 的 Java 编程语言中的常量(有时称为类型代码)。
----------------------------------------------------------------------
NULL
public static final int NULL标识一般 SQL 值 NULL 的 Java 编程语言中的常量。
----------------------------------------------------------------------
OTHER
public static final int OTHERJava 编程语言中的常量,该常量指示 SQL 类型是特定于数据库的并且被映射到可通过 getObject 和 setObject 方法访问的 Java 对象。
----------------------------------------------------------------------
JAVA_OBJECT
public static final int JAVA_OBJECT标识一般 SQL 类型 JAVA_OBJECT 的 Java 编程语言中的常量(有时称为类型代码)。
----------------------------------------------------------------------
DISTINCT
public static final int DISTINCT标识一般 SQL 类型 DISTINCT 的 Java 编程语言中的常量(有时称为类型代码)。
----------------------------------------------------------------------
STRUCT
public static final int STRUCT标识一般 SQL 类型 STRUCT 的 Java 编程语言中的常量(有时称为类型代码)。
----------------------------------------------------------------------
ARRAY
public static final int ARRAY标识一般 SQL 类型 ARRAY 的 Java 编程语言中的常量(有时称为类型代码)。
----------------------------------------------------------------------
BLOB
public static final int BLOB标识一般 SQL 类型 BLOB 的 Java 编程语言中的常量(有时称为类型代码)。
----------------------------------------------------------------------
CLOB
public static final int CLOB标识一般 SQL 类型 CLOB 的 Java 编程语言中的常量(有时称为类型代码)。
----------------------------------------------------------------------
REF
public static final int REF标识一般 SQL 类型 REF 的 Java 编程语言中的常量(有时称为类型代码)。
----------------------------------------------------------------------
DATALINK
public static final int DATALINK标识一般 SQL 类型 DATALINK 的 Java 编程语言中的常量(有时称为类型代码)。
----------------------------------------------------------------------
BOOLEAN
public static final int BOOLEAN标识一般 SQL 类型 BOOLEAN 的 Java 编程语言中的常量(有时称为类型代码)。
----------------------------------------------------------------------
ROWID
public static final int ROWID标识一般 SQL 类型 ROWID 的 Java 编程语言中的常量(有时称为类型代码)。
----------------------------------------------------------------------
NCHAR
public static final int NCHAR标识一般 SQL 类型 NCHAR 的 Java 编程语言中的常量(有时称为类型代码)。
----------------------------------------------------------------------
NVARCHAR
public static final int NVARCHAR标识一般 SQL 类型 NVARCHAR 的 Java 编程语言中的常量(有时称为类型代码)。
----------------------------------------------------------------------
LONGNVARCHAR
public static final int LONGNVARCHAR标识一般 SQL 类型 LONGNVARCHAR 的 Java 编程语言中的常量(有时称为类型代码)。
----------------------------------------------------------------------
NCLOB
public static final int NCLOB标识一般 SQL 类型 NCLOB 的 Java 编程语言中的常量(有时称为类型代码)。
----------------------------------------------------------------------
SQLXML
public static final int SQLXML标识一般 SQL 类型 XML 的 Java 编程语言中的常量(有时称为类型代码)。
上面代码所调用的JAVA类库中的方法解析:
CallableStatement prepareCall(String sql)
throws SQLException
该方法是java.sql.Connection类的方法。
CallableStatement 对象来调用数据库存储过程。CallableStatement 对象提供了设置其 IN 和 OUT 参数的方法,以及用来执行调用存储过程的方法。
注:为了处理存储过程调用语句,此方法进行了优化。某些驱动程序可以在调用 prepareCall 方法后将调用语句发送给数据库;另一些则直到执行了 CallableStatement 对象后才可以发送。这对用户没有直接影响;但它的确会影响哪些方法将抛出某些 SQLException。
使用返回的 CallableStatement 对象创建的结果集在默认情况下类型为 TYPE_FORWARD_ONLY,并带有 CONCUR_READ_ONLY 并发级别。已创建结果集的可保存性可调用 getHoldability() 确定。
参数:
sql - 可以包含一个或多个 '?' 参数占位符的 SQL 语句。通常此语句是使用 JDBC 调用转义语法指定的。
返回:
包含预编译 SQL 语句的新的默认 CallableStatement 对象
抛出:
SQLException - 如果发生数据库访问错误,或者在关闭的连接上调用此方法
void registerOutParameter(int parameterIndex,
int sqlType)
throws SQLException
该方法是java.sql.CallableStatement接口的方法。
按顺序位置 parameterIndex 将 OUT 参数注册为 JDBC 类型 sqlType。所有 OUT 参数都必须在执行存储过程前注册。
sqlType 为 OUT 参数指定的 JDBC 类型确定必须用于 get 方法,以读取该参数值的 Java 类型。
如果预期返回给此输出参数的 JDBC 类型是取决于此特定数据库的,则 sqlType 应该是 java.sql.Types.OTHER。方法 getObject(int) 获取该值。
参数:
parameterIndex - 第一个参数是 1,第二个参数是 2,依此类推
sqlType - java.sql.Types 定义的 JDBC 类型代码。如果参数是 JDBC 类型 NUMERIC 或 DECIMAL,则应使用接受标度值的那种 registerOutParameter。
抛出:
SQLException - 如果 parameterIndex 无效;如果发生数据库访问错误,或者在关闭的 CallableStatement 上调用此方法
SQLFeatureNotSupportedException - 如果 sqlType 是 ARRAY、BLOB、CLOB、DATALINK、JAVA_OBJECT、NCHAR、NCLOB、NVARCHAR、LONGNVARCHAR、REF、ROWID、SQLXML 或 STRUCT 数据类型之一并且 JDBC 驱动程序不支持此数据类型