设为首页 收藏本站
查看: 1384|回复: 0

[经验分享] 在JAVA中调用DB2存储过程

[复制链接]

尚未签到

发表于 2016-11-16 01:03:32 | 显示全部楼层 |阅读模式
调用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 驱动程序不支持此数据类型

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-300731-1-1.html 上篇帖子: DB2 错误代码大全——SQLSTATE 消息 下篇帖子: DB2数据库备份与恢复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表