`

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

    在IT领域,数据库存储过程是实现复杂业务逻辑和优化性能的重要工具。Sybase数据库系统,作为一款企业级的关系型数据库管理...理解JNI调用约定和数据库对Java的支持特性,有助于顺利地将Java集成到Sybase存储过程中。

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

    本话题将详细讲解如何使用Java调用带有参数的Oracle存储过程,并获取存储过程返回的集合。 首先,Oracle存储过程是一种预编译的SQL语句集合,它可以在数据库服务器端执行,提高性能,减少网络传输。`PROCEDURE.sql`...

    Java操做Sysbase存储过程

    以下是如何使用Java调用Sysbase存储过程的示例: ```java CallableStatement cs = conn.prepareCall("{call myProcedure(?, ?)}"); cs.setInt(1, inputParam1); cs.registerOutParameter(2, java.sql.Types.VARCHAR...

    java+数据库依赖+sybase.rar

    在Java中,可以通过JDBC调用存储过程,例如: ```java CallableStatement cs = conn.prepareCall("{call myProcedure(?, ?)}"); cs.setInt(1, inputParam); cs.registerOutParameter(2, Types.INTEGER); cs.execute...

    Sybase驱动(Java)

    jconn4是目前最现代的Sybase JDBC驱动,它支持更多的Sybase数据库特性,如新SQL语法、存储过程、事务管理等。jconn4完全基于Java,提供更高的性能和稳定性,同时兼容更多的Java应用服务器和框架。它还包含了对...

    jconn4 jdbc连接sybase驱动

    此外,`jconn4`驱动还优化了对Sybase特定功能的支持,如存储过程、触发器、事务处理等。 总之,`jconn4`是Java开发者与Sybase数据库进行通信的重要工具,通过标准的JDBC接口,它简化了Java应用程序与Sybase数据库的...

    使用Sybase+WorkSpace调试存储过程和触发器.pdf

    《使用Sybase+WorkSpace调试存储过程和触发器》 Sybase WorkSpace是一款基于Eclipse架构的集成开发环境,特别适合于服务导向架构(SOA)的开发,能够构建各种服务,如消息服务、SOAP服务、Java服务等,从而加速企业级...

    Sybase数据库类型转Java类型

    标题 "Sybase数据库类型转Java类型" 涉及到的是在编程中处理数据库操作时,如何将Sybase数据库中的数据类型映射到Java编程语言中的对应类型。这是一个常见的问题,因为不同的数据库系统和编程语言都有自己的一套数据...

    Sybase ASE 12.5 Adaptive Server Enterprise中的Java.pdf

    - **调用Java存储过程**:与传统的T-SQL存储过程类似,只需要使用EXECUTE命令即可调用已经定义好的Java存储过程。 ##### 2.2 Java触发器 Java触发器是一种特殊的Java存储过程,当特定的数据库事件发生时自动执行。...

    一些常用数据库存储过程

    在Java中调用Oracle存储过程的方法如下: ```java CallableStatement cs = conn.prepareCall("{ call add_numbers(?,?,?) }"); cs.setInt(1, 10); // 设置第一个输入参数 cs.setInt(2, 20); // 设置第二个输入参数 ...

    java + sybase 定时ftp文件上传

    在IT行业中,集成不同的技术以实现自动化流程是常见的需求,比如本例中的“java + sybase 定时ftp文件上传”。这个场景涉及到Java编程、Sybase数据库管理和FTP文件传输等核心知识点,接下来我们将深入探讨这些内容。...

    数据库存储过程的写法\\连接各种数据库写法

    ### 数据库存储过程的写法及连接各种数据库的方法 #### 概述 本文将详细介绍如何在不同的数据库系统中编写存储过程以及如何建立与这些数据库的连接。存储过程是一种预编译的SQL代码块,它可以存储在数据库服务器上...

    java连接sybase jdbc驱动包,jconn2.jar,jconn3.jar,jconn4.jar

    2. jconn3.jar: 随着JDBC规范的升级,jconn3.jar应运而生,它支持JDBC 3.0规范,带来了更多的特性,比如批处理、存储过程调用和更好的性能优化。这个版本的驱动通常被认为比jconn2.jar更稳定,功能也更强大。 3. ...

    sybase培训笔记

    Sybase IQ的特点包括垂直数据存储和压缩,优化的数据存取方法,基于位的存储技术,即席查询优化器,以及标准的对外接口。此外,它还提供Sybase Central工具以方便管理。值得注意的是,Sybase IQ不适合用于在线事务...

    Sybase IQ 15.1 系统管理手册(下)

    Sybase IQ 的存储过程支持多种语言,如 Transact-SQL 和 Java,使得开发人员可以根据项目需求选择最适合的语言来编写存储过程。 ##### 2.2 创建存储过程 创建存储过程主要包括以下几个步骤: 1. **定义输入参数**:...

    sybase库中导出全部表的oracle、mysql和sybase的建表语句

    通常,这可以通过使用数据库的元数据查询功能实现,比如使用`sp_help`存储过程或者SQL查询来获取表的结构信息。在Java环境中,可以利用JDBC(Java Database Connectivity)API编写程序,连接到Sybase数据库,执行...

    RS6000/AIX安装sybase过程

    - 使用`useradd -g sybase sybase`创建Sybase用户并将其添加到Sybase组中。 ##### 3. Sybase软件空间要求 除了数据库文件之外,还需要为Sybase软件预留足够的磁盘空间。最低要求是1000MB的空间用于软件安装。 ###...

    sybase驱动jar包 jconn2& jconn3& jconn4

    在Java开发中,为了与Sybase数据库进行交互,我们需要使用特定的Java Database Connectivity (JDBC) 驱动。本话题将详细阐述`jconn2.jar`, `jconn3.jar`, 和 `jconn4.jar` 这三个Sybase JDBC驱动的不同版本及其特性...

Global site tag (gtag.js) - Google Analytics