- 浏览: 419748 次
- 性别:
- 来自: 成都
-
文章分类
最新评论
-
kaihop:
很好,值得学习
Axis2开发WebService客户端 的3种方式 -
白天看黑夜:
java过滤emoji字符处理,希望能帮到你http://ww ...
Java解决Emoji表情符问题 -
hongbai:
不能匹配这个:http://harveyzeng.iteye. ...
正则表达式匹配域名、网址、url -
qwertyuiopqaz:
引用
Axis2开发WebService客户端 的3种方式 -
whj001:
很详细 ,
Axis2开发WebService客户端 的3种方式
1,无返回参数
create procedure test(@a int,@b int)
as
begin
insert into tbl_test(a,b) values(@a,@b)
end
--------
调用方法:exec(execute) "test(1)"
create procedure test_sp_1(@y varchar(30))
as
begin
update user_tab set delete_id=1000 where user_name=@y and delete_datetime is not null
end
go
调用:exec test_sp_1 'hello'
2,有返回参数
create procedure test2(@a int,@b int,@c int output,@d int output)
as
begin
select @c=@a+@b
select @d=@a*@b
end
-------
调用方法:
declare @cc int,@dd int
test2 2,3,@cc output,@dd output
3,返回记录集
create procedure test3(@a int)
as
begin
select * from tbl_test where a>@a
end
4,java调用存储过程报模式不对的问题:
通过JAVA、JDBC驱动为JTDS1.2调用SYBASE12.5存储过程的时候,老是报该过程只允许在"Unchained"模式下运,通过命令sp_procxmode查看的时候,该过程也是"Unchained"模式,Hibernate报运行命令"set chained off"即可将当前库的存储过程运行模式改为"Unchianed",但执行后也不行;后面在一个国外的网站查到,将其运行模式改为"anymode"即可,采用命令:sp_procxmode 过程名 'anymode' ,但要修改所有与该过程相关的,被该过程调用的模式都为"anymode"才行,据说只有Sybase有这个毛病,其它的数据库都没有这个问题。
如: exec sp_procxmode 'crud_test_sp_1', 'anymode'
注:chained和Unchained的分别简单的说,就是chained会自动起事务;Unchained不会自动启事务,需要用户显性的用begin tran..commit/rollback去定义。
4,java调用存储过程的方法:
CallableStatement 对象为所有的 DBMS 提供了一种以标准形式调用已储存过程的方法。已储存过程储存在数据库中。对已储存过程的调用是 CallableStatement 对象所含的内容。这种调用是用一种换码语法来写的,有两种形式:一种形式带结果参数,另一种形式不带结果参数(有关换码语法的信息,参见第 4 节“语句”)。结果参数是一种输出 (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。
4.1 创建 CallableStatement 对象
CallableStatement 对象是用 Connection 方法 prepareCall 创建的。下例创建 CallableStatement 的实例,其中含有对已储存过程 getTestData 调用。该过程有两个变量,但不含结果参数:
CallableStatement cstmt = con.prepareCall(
"{call getTestData(?, ?)}");
其中 ? 占位符为 IN、 OUT 还是 INOUT 参数,取决于已储存过程 getTestData。
4.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 值的特殊机制。
4.3 INOUT 参数
既支持输入又接受输出的参数(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(
"{call reviseTotal(?)}");
cstmt.setByte(1, 25);
cstmt.registerOutParameter(1, java.sql.Types.TINYINT);
cstmt.executeUpdate();
byte x = cstmt.getByte(1);
4.4 先检索结果,再检索 OUT 参数
由于某些 DBMS 的限制,为了实现最大的可移植性,建议先检索由执行 CallableStatement 对象所产生的结果,然后再用 CallableStatement.getXXX 方法来检索 OUT 参数。
如果 CallableStatement 对象返回多个 ResultSet 对象(通过调用 execute 方法),在检索 OUT 参数前应先检索所有的结果。这种情况下,为确保对所有的结果都进行了访问,必须对 Statement 方法 getResultSet、getUpdateCount 和 getMoreResults 进行调用,直到不再有结果为止。
检索完所有的结果后,就可用 CallableStatement.getXXX 方法来检索 OUT 参数中的值。
4.5 检索作为 OUT 参数的 NULL 值
返回到 OUT 参数中的值可能会是 JDBC NULL。当出现这种情形时,将对 JDBC NULL 值进行转换以使 getXXX 方法所返回的值为 null、0 或 false,这取决于 getXXX 方法类型。对于 ResultSet 对象,要知道 0 或 false 是否源于 JDBC NULL 的唯一方法,是用方法 wasNull 进行检测。如果 getXXX 方法读取的最后一个值是 JDBC NULL,则该方法返回 true,否则返回 flase。第 5 节“ResultSet”将给出详细信息。
CallableStatement 对象为所有的 DBMS 提供了一种以标准形式调用已储存过程的方法。已储存过程储存在数据库中。对已储存过程的调用是 CallableStatement 对象所含的内容。这种调用是用一种换码语法来写的,有两种形式:一种形式带结果参数,另一种形式不带结果参数(有关换码语法的信息,参见第 4 节“语句”)。结果参数是一种输出 (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。
发表评论
-
DBCP2数据源配置含义说明[转]
2018-11-22 10:59 1042dbcp官网:http://commons.apache. ... -
Spring 定时任务及cron表达式
2017-03-16 10:22 4158转发一篇文章并结合实践记录一下,以后可以参考 Ja ... -
mybatis-generator生成mapper等对象
2017-03-15 15:34 2223参考这篇问题基本就能生成了:http://blog. ... -
Java解决Emoji表情符问题
2016-01-28 17:29 22257问题描述:客户调用 ... -
mysql查询优化文章收集
2015-11-05 09:51 8421. MySQL执行计划解读 http://www ... -
mybatis 模糊查询%问题
2015-09-28 18:52 4313---------------------------- ... -
常见异常备忘
2015-09-23 17:59 5241. jQuery上传插件Uploadify出现Ht ... -
mysql使用触发器或函数实现自增序列
2015-07-06 22:48 2008转自:http://foolraty.iteye.com/ ... -
省市区三级联动实现
2015-06-02 18:11 2264参考文档: 从QQ网站中提取的纯JS省市区三级联动 h ... -
面试题记录4
2015-03-10 18:19 6461. 类加载的顺序(初始化顺序) 类加载的顺 ... -
理解Java移位操作
2014-11-06 12:26 8071. 理解移位操作之前先 ... -
一个排好序的数组,找出两数之和为m的所有组合
2014-09-25 16:20 1222public class Test { ... -
Java String知识点
2014-09-19 11:01 9211. 这段程序的结果是什 ... -
用JAVA导出CSV
2014-07-08 14:00 1318/** * 导出为CVS文件 * ... -
Java面试问题
2014-04-17 17:37 861JAVA 接口和抽象类有 ... -
Java动态执行代码Bsh
2014-02-28 17:42 11374首先要到http://www.beanshell.or ... -
Hibernate错误:org.hibernate.LazyInitializationException: illegal access to loading
2013-09-16 19:16 1457org.hibernate.LazyInitializ ... -
Axis2开发WebService客户端 的3种方式
2013-04-18 18:05 79855第一RPC方式,不生成客户端代码 第二,document ... -
freemarker用字符串构建模版
2013-04-15 16:14 1166代码: import java.io.IOExcep ... -
Java基本类型、包装类以及自定义类判断
2013-02-18 17:48 9278一、基本类型与包装类判断 public class Te ...
相关推荐
在IT领域,数据库存储过程是实现复杂业务逻辑和优化性能的重要工具。Sybase数据库系统,作为一款企业级的关系型数据库管理...理解JNI调用约定和数据库对Java的支持特性,有助于顺利地将Java集成到Sybase存储过程中。
本话题将详细讲解如何使用Java调用带有参数的Oracle存储过程,并获取存储过程返回的集合。 首先,Oracle存储过程是一种预编译的SQL语句集合,它可以在数据库服务器端执行,提高性能,减少网络传输。`PROCEDURE.sql`...
以下是如何使用Java调用Sysbase存储过程的示例: ```java CallableStatement cs = conn.prepareCall("{call myProcedure(?, ?)}"); cs.setInt(1, inputParam1); cs.registerOutParameter(2, java.sql.Types.VARCHAR...
在Java中,可以通过JDBC调用存储过程,例如: ```java CallableStatement cs = conn.prepareCall("{call myProcedure(?, ?)}"); cs.setInt(1, inputParam); cs.registerOutParameter(2, Types.INTEGER); cs.execute...
jconn4是目前最现代的Sybase JDBC驱动,它支持更多的Sybase数据库特性,如新SQL语法、存储过程、事务管理等。jconn4完全基于Java,提供更高的性能和稳定性,同时兼容更多的Java应用服务器和框架。它还包含了对...
《使用Sybase+WorkSpace调试存储过程和触发器》 Sybase WorkSpace是一款基于Eclipse架构的集成开发环境,特别适合于服务导向架构(SOA)的开发,能够构建各种服务,如消息服务、SOAP服务、Java服务等,从而加速企业级...
此外,`jconn4`驱动还优化了对Sybase特定功能的支持,如存储过程、触发器、事务处理等。 总之,`jconn4`是Java开发者与Sybase数据库进行通信的重要工具,通过标准的JDBC接口,它简化了Java应用程序与Sybase数据库的...
标题 "Sybase数据库类型转Java类型" 涉及到的是在编程中处理数据库操作时,如何将Sybase数据库中的数据类型映射到Java编程语言中的对应类型。这是一个常见的问题,因为不同的数据库系统和编程语言都有自己的一套数据...
- **调用Java存储过程**:与传统的T-SQL存储过程类似,只需要使用EXECUTE命令即可调用已经定义好的Java存储过程。 ##### 2.2 Java触发器 Java触发器是一种特殊的Java存储过程,当特定的数据库事件发生时自动执行。...
在IT行业中,集成不同的技术以实现自动化流程是常见的需求,比如本例中的“java + sybase 定时ftp文件上传”。这个场景涉及到Java编程、Sybase数据库管理和FTP文件传输等核心知识点,接下来我们将深入探讨这些内容。...
2. jconn3.jar: 随着JDBC规范的升级,jconn3.jar应运而生,它支持JDBC 3.0规范,带来了更多的特性,比如批处理、存储过程调用和更好的性能优化。这个版本的驱动通常被认为比jconn2.jar更稳定,功能也更强大。 3. ...
1. **提高开发效率**:Java存储过程和高级工具的使用降低了数据库操作的复杂性,使开发者能够更快地完成项目开发。 2. **增强应用性能**:通过在数据库层面执行复杂逻辑,减少了网络延迟,提升了整体系统的响应速度...
### 数据库存储过程的写法及连接各种数据库的方法 #### 概述 本文将详细介绍如何在不同的数据库系统中编写存储过程以及如何建立与这些数据库的连接。存储过程是一种预编译的SQL代码块,它可以存储在数据库服务器上...
- 使用`useradd -g sybase sybase`创建Sybase用户并将其添加到Sybase组中。 ##### 3. Sybase软件空间要求 除了数据库文件之外,还需要为Sybase软件预留足够的磁盘空间。最低要求是1000MB的空间用于软件安装。 ###...
Sybase IQ的特点包括垂直数据存储和压缩,优化的数据存取方法,基于位的存储技术,即席查询优化器,以及标准的对外接口。此外,它还提供Sybase Central工具以方便管理。值得注意的是,Sybase IQ不适合用于在线事务...
Sybase IQ 的存储过程支持多种语言,如 Transact-SQL 和 Java,使得开发人员可以根据项目需求选择最适合的语言来编写存储过程。 ##### 2.2 创建存储过程 创建存储过程主要包括以下几个步骤: 1. **定义输入参数**:...
通常,这可以通过使用数据库的元数据查询功能实现,比如使用`sp_help`存储过程或者SQL查询来获取表的结构信息。在Java环境中,可以利用JDBC(Java Database Connectivity)API编写程序,连接到Sybase数据库,执行...
Sybase是一种关系型数据库管理系统(RDBMS),广泛应用于企业级数据存储和管理。该压缩包可能包含了不同版本或类型的Sybase驱动,以便于用户根据需要进行选择和使用。 描述中提到了几个关键的数据库驱动,包括jconn...