prepareCall()运行存储过程

prepareCall()运行存储过程

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

prepareCall()运行存储过程此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“”,获取验证码。在微信里搜索“”或者“”或者微信扫描右侧二维码都可以关注本站微信公众号。

CallableStatement 对象为全部的 DBMS 提供了一种以标准形式调用已储存过程的方法。已储存过程储存在数据库中。对已储存过程的调用是 CallableStatement对象所含的内容。这样的调用是用一种换码语法来写的,有两种形式:一种形式带结果參,还有一种形式不带结果參数。结果參数是一种输出 (OUT) 參数,是已储存过程的返回值。两种形式都可带有数量可变的输入(IN 參数)、输出(OUT 參数)或输入和输出(INOUT 參数)的參数。问号将用作參数的占位符。
 在 JDBC 中调用已储存过程的语法例如以下所看到的。注意,方括号表示其间的内容是可选项;方括号本身并不是语法的组成部份。
{call 过程名[(?, ?, …)]}
  返回结果參数的过程的语法为:
{? = call 过程名[(?, ?, …)]}
  不带參数的已储存过程的语法相似:
{call 过程名}

  通常,创建 CallableStatement 对象的人应当知道所用的 DBMS 是支持已储存过程的,而且知道这些过程都是些什么。然而,假设须要检查,多种DatabaseMetaData 方法都能够提供这样的信息。比如,假设 DBMS 支持已储存过程的调用,则supportsStoredProcedures 方法将返回 true,而getProcedures 方法将返回对已储存过程的描写叙述。CallableStatement 继承 Statement 的方法(它们用于处理一般的 SQL 语句),还继承了 PreparedStatement 的方法(它们用于处理 IN 參)。

  CallableStatement 中定义的全部方法都用于处理 OUT 參数或 INOUT 參数的输出部分:注冊 OUT 參数的 JDBC 类型(一般 SQL 类型)、从这些參数中检索结果,或者检查所返回的值是否为 JDBC NULL。

1、创建 CallableStatement 对象

  CallableStatement 对象是用 Connection 方法 prepareCall 创建的。下例创建 CallableStatement 的实例,当中含有对已储存过程 getTestData 调用。该过程有两个变量,但不含结果參数:

CallableStatement cstmt = con.prepareCall(“{call getTestData(?, ?)}”);

  当中?占位符为IN、OUT还是INOUT參数,取决于已储存过程getTestData。

2、IN和OUT參数

  将IN參数传给 CallableStatement 对象是通过 setXXX 方法完毕的。该方法继承自 PreparedStatement。所传入參数的类型决定了所用的setXXX方法(比如,用 setFloat 来传入 float 值等)。

  假设已储存过程返回 OUT 參数,则在运行 CallableStatement 对象曾经必须先注冊每一个 OUT 參数的 JDBC 类型(这是必需的,由于某些 DBMS 要求 JDBC 类型)。注冊 JDBC 类型是用 registerOutParameter 方法来完毕的。语句运行完后,CallableStatement 的 getXXX 方法将取回參数值。正确的 getXXX 方法是为各參数所注冊的 JDBC 类型所相应的 Java 类型。换言之, registerOutParameter 使用的是 JDBC 类型(因此它与数据库返回的 JDBC 类型匹配),而 getXXX 将之转换为 Java 类型。

  作为演示样例,下述代码先注冊 OUT 參数,运行由 cstmt 所调用的已储存过程,然后检索在 OUT 參数中返回的值。方法 getByte 从第一个 OUT 參数中取出一个 Java 字节,而 getBigDecimal 从第二个 OUT 參数中取出一个 BigDecimal 对象(小数点后面带三位数):

CallableStatement cstmt = con.prepareCall(“{call getTestData(?, ?)}”);

cstmt.registerOutParameter(1, java.sql.Types.TINYINT);

cstmt.registerOutParameter(2, java.sql.Types.DECIMAL, 3);

cstmt.executeQuery();

byte x = cstmt.getByte(1);

java.math.BigDecimal n = cstmt.getBigDecimal(2, 3);

  CallableStatement 与 ResultSet 不同,它不提供用增量方式检索大 OUT 值的特殊机制。

3、INOUT參数

  既支持输入又接受输出的參数(INOUT 參数)除了调用 registerOutParameter 方法外,还要求调用适当的 setXXX 方法(该方法是从 PreparedStatement 继承来的)。setXXX 方法将參数值设置为输入參数,而 registerOutParameter 方法将它的 JDBC 类型注冊为输出參数。setXXX 方法提供一个 Java 值,而驱动程序先把这个值转换为 JDBC 值,然后将它送到数据库中。这样的 IN 值的 JDBC 类型和提供给 registerOutParameter 方法的 JDBC 类型应该同样。然后,要检索输出值,就要用相应的 getXXX 方法。比如,Java 类型为byte 的參数应该用法 setByte 来赋输入值。应该给registerOutParameter 提供类型为 TINYINT 的 JDBC 类型,同一时候应使用 getByte 来检索输出值。

  下例假设有一个已储存过程 reviseTotal,其唯一參数是 INOUT 參数。方法setByte 把此參数设为 25,驱动程序将把它作为 JDBC TINYINT 类型送到数据库中。接着,registerOutParameter 将该參数注冊为 JDBC TINYINT。运行完该已储存过程后,将返回一个新的 JDBC TINYINT 值。方法 getByte 将把这个新值作为 Java byte 类型检索。

CallableStatement cstmt = con.prepareCall(“{call reviseTotal(?)}”);

cstmt.setByte(1, 25);

cstmt.registerOutParameter(1, java.sql.Types.TINYINT);

cstmt.executeUpdate();

byte x = cstmt.getByte(1);

4、先检索结果,再检索 OUT 參数

  由于某些 DBMS 的限制,为了实现最大的可移植性,建议先检索由运行CallableStatement 对象所产生的结果,然后再用 CallableStatement.getXXX 方法来检索 OUT 參数。假设 CallableStatement 对象返回多个 ResultSet 对象(通过调用 execute 方法),在检索 OUT 參数前应先检索全部的结果。这样的情况下,为确保对全部的结果都进行了訪问,必须对 Statement 方法 getResultSet、getUpdateCount 和getMoreResults 进行调用,直到不再有结果为止。

  检索全然部的结果后,就可用 CallableStatement.getXXX 方法来检索 OUT 參数中的值。

5、检索作为OUT參数的NULL值

返回到 OUT 參数中的值可能会是JDBC NULL。当出现这样的情形时,将对 JDBC NULL 值进行转换以使 getXXX 方法所返回的值为 null、0 或 false,这取决于getXXX 方法类型。对于 ResultSet 对象,要知道0或false是否源于JDBCNULL的唯一方法,是用方法wasNull进行检測。假设 getXXX 方法读取的最后一个值是 JDBC NULL,则该方法返回 true,否则返回 flase。

 

注:对于多行的返回,则必须通过强制转型为ResultSet进行返回,此时将返回指向多行游标的指针。如

Conncetion con = getConnection();

CallableStatement cs = null;

ResultSet rs = null;

 

try{

    cs = con.prepareCall(“{?=call getCallfuc(?,?)}”);

    cs.registerOutParameter(1,Types.OTHER);

    cs.setInt(2,0);

    cs.setInt(3,0);

  

    cs.execute();

    rs = (ResultSet)cs.getObject(1);

    while(rs.next()) {

       ……. 

   }

}catch(Exception ex){}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/117971.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • BZOJ1915[USACO 2010 Open Gold 1.Cow Hopscotch]——DP+斜率优化

    BZOJ1915[USACO 2010 Open Gold 1.Cow Hopscotch]——DP+斜率优化

  • python做微信回复机器人_Python自动化脚本

    python做微信回复机器人_Python自动化脚本Python几十行代码轻松实现微信自动回复机器人最近因为太无聊了就考虑能不能做一些好玩的东西出来,正好在CSDN的推荐上看到大佬做的微信自动回复机器人,觉得很有趣,因此想着自己也能动手做一个。在此就写下我的具体思路和实现过程吧。首先,我是选择先找一个具有自动回复功能的机器,调用其API,上网搜索了一下,发现大家伙都推荐图灵机器人,然后我就溜过去找了一下图灵机器人,最后发现:它收费!!!可恶啊,难道刚开始就要结束了吗?后来我又开始了百度大法,最后发现了一个免费的机器人API:青云客。测试了一手

  • 我的flashfxp左右界面怎么变成这样了?

    我的flashfxp左右界面怎么变成这样了?

  • Win32 API 常量定义(四)

    PublicConstMIXER_OBJECTF_HMIDIOUT=(MIXER_OBJECTF_HANDLEOrMIXER_OBJECTF_MIDIOUT)PublicConstMIXER_OBJECTF_MIDIIN=&H40000000PublicConstMIXER_OBJECTF_HMIDIIN=(MIXER_OBJECTF_HANDLEOrMIX

  • java实现四种常用排序算法

    java实现四种常用排序算法四种常用排序算法冒泡排序特点:效率低,实现简单思想(从小到大排):每一趟将待排序序列中最大元素移到最后,剩下的为新的待排序序列,重复上述步骤直到排完所有元素。这只是冒泡排序的一种,当然也可以从后往前排。publicvoidbubbleSort(intarray[]){intt=0;for(inti=0;i<…

  • Java基础(冒泡排序)[通俗易懂]

    Java基础(冒泡排序)[通俗易懂]一.冒泡排序简介比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。动…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号