`

sybase存储过程及Java调用

 
阅读更多

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去定义。

参考:http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.ase_15.0.sqlug/html/sqlug/sqlug855.htm



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。 


 

分享到:
评论

相关推荐

    sybase数据库存储过程调用外部JAVA

    现在基本上所有的数据库都支持存储过程嵌入JAVA程序,以便实现在没有系统服务器的情况定时调度任务。对于不同的数据库,存储过程和调用方法都不相同。下面主要以Sybase举例。

    Java调用带参数的存储过程并返回集合

    Java调用带参数的Oracle 存储过程并返回集合,

    java 面试题 总结

    ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector...

    SybaseTransfer:Sybase数据库迁移

    迁移对象 迁移对象与数据库对象对应,在本项目中迁移任务具体就是指表、视图和存储过程。 过滤器 过滤器实现对目标迁移对象的一种筛选,比如要迁移指定用户模式的对象,就可以使用模式过滤器。目前程序中已经实现的...

    超级有影响力霸气的Java面试题大全文档

     ArrayList 和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,...

    数据库设计/自动安装工具BDB 2007 V2.3(For Oracle/MS SQLServer/Access/MySQL/SQLAnyWhere/Sybase)

    <br>此外、在BDB中提供了对开发语言的支持、 其数据库结构定义文件采用XML标准格式、 并且开放了外部读取数据库结构的源程序(C#/Delphi/JAVA)、 您可以通过使用BDB来简化软件开发和部署过程: <br>1...

    数据库设计和自动安装工具BDB V2.2(for Oracle/MS SQLServer/MySQL/Access/SQLAnywhere/Sybase)

    <br>此外、在BDB中提供了对开发语言的支持、 其数据库结构定义文件采用XML标准格式、 并且开放了外部读取数据库结构的源程序(C#/Delphi/JAVA)、 您可以通过使用BDB来简化软件开发和部署过程: <br>1...

    SQL Anywhere恢复工具介绍

    SQL Anywhere 提供了企业级的功能 包括完全的事务处理 无与伦比的可靠性和功能 包括参照完整性 存储过程 触发器 行级锁 自动的任务安排和自动恢复等功能 易于使用 易于管理 降低最终用户的日常管理费用 多平台...

    积分管理系统java源码--:数据库原理作业

    积分管理系统java源码 关于关系型数据库系统的调研 什么是关系型数据库 关系型数据库以行和列的形式存储数据,以便于用户理解。这一系列的行和列被称为表,一组表组成了 数据库。用户用查询来检索数据库中的数据。...

    数据库设计和数据库部署工具BDB 2007 Pro V2.3

    您可以通过使用BDB来简化软件开发和部署过程: 1、数据库设计、数据库部署:支持和数据库之间的正向和反向工程。 既可以通过BDB进行新的数据库设计,自动创建或更新至实体数据库、 也可导出现有数据库结构,并为其...

    dbvis_windows_9_0_6.exe

    DbVisualizer使用JAVA开发的,目前拿他来做Oracle、MySQL、PostgreSQL甚至包括 MS SQL Server 数据库管理都是一件非常轻松的事情。 新版本已经集成了JDBC 的jar包,所以在安装6.0版本时要选中JDBC 的jar包,不然在...

    数据库工具 bdb v3.6 +界面预览 (dbbuilder )

    数据表,索引,约束,缺省值,触发器,视图,存储过程,函数以及数据表数据。 5,查询分析 数据库快速查询分析功能。可进行数据表数据查询,编辑及导出操作: A,提供专用的SQL编辑器。支持语法高亮,脚本预定义...

    dbvis_windows-x64_9_1_5

    DbVisualizer使用JAVA开发的,拿他来做Oracle、MySQL、PostgreSQL甚至包括 MS SQL Server 数据库管理都是一件非常轻松的事情。 新版本已经集成了JDBC 的jar包,所以在安装6.0版本时要选中JDBC 的jar包,不然在创建与...

    dbvis_windows-x64_9_0_6.zip

    DbVisualizer使用JAVA开发的,目前拿他来做Oracle、MySQL、PostgreSQL甚至包括 MS SQL Server 数据库管理都是一件非常轻松的事情。 新版本已经集成了JDBC 的jar包,所以在安装6.0版本时要选中JDBC 的jar包,不然在...

    数据库设计和部署软件BDB 专业版v2.7

    开放的数据库物理结构文件格式(XML标准格式),并提供了外部调用数据库结构源程序 (包含C#/Delphi/JAVA三个版本)。 <br>11,支持多语言。 可根据需要增加新的语言包。 <br>website: ...

    数据库设计和部署软件BDB 个人版V2.6

    可迁移的数据对象包括: 数据表,索引,约束,缺省值,触发器,视图,存储过程,函数以及数据表数据。 <br>5,查询分析 数据库快速查询分析功能。可进行数据表数据查询,编辑及导出操作: A,提供专用...

    数据库设计和部署软件BDB 专业版V2.6

    可迁移的数据对象包括: 数据表,索引,约束,缺省值,触发器,视图,存储过程,函数以及数据表数据。 <br>5,查询分析 数据库快速查询分析功能。可进行数据表数据查询,编辑及导出操作: A,提供专用...

    ASP.NET BS结构的城市酒店入住信息管理系统的设计(源代码+论文)

    数据库技术是研究数据库的结构、存储、设计、管理和使用的一门软件学科。 由于本系统涉及到许多数据的处理,这就需要有一个强大的后台数据库管理系统支持。目前主要的数据库有:Access、FoxPro、Excel、Sybase、...

    bdb 2008 3.2

    数据表,索引,约束,缺省值,触发器,视图,存储过程,函数以及数据表数据。 5,查询分析 数据库快速查询分析功能。可进行数据表数据查询,编辑及导出操作: A,提供专用的SQL编辑器。支持语法高亮,脚本预定义...

    数据库课程设计——图书管理系统.doc

    非过程化语言 SQL是一个非过程化的语言,因为它一次处理一个记录,对数据提供自动导航。SQL允 许用户在高层的数据结构上工作,而不对单个记录进行操作,可操作记录集,所有SQL 语 句接受集合作为输入,返回集合作为输出...

Global site tag (gtag.js) - Google Analytics