远程Sybase数据库技术支持,联系手机:13811580958,QQ:289965371!

 

随着Sybase被完全整合到SAP下,Sybase原来的支持网站被SAP Support Portal取代。
只有购买了SAP服务的用户才能使用账号登录SAP Support Portal进行介质下载、补丁升级、报Incident等。
目前,原Sybase所有产品(包括:Adaptive Server Enterprise、Sybase IQ、Replication Server、PowerDesigner等)的官方手册仍然可以从http://infocenter.sybase.com/help/index.jsp进行浏览或下载。暂不清楚该网站http://infocenter.sybase.com/help/index.jsp何时会被完全迁移到SAP Support上!
Sybase官方手册英文版有html和pdf两种格式,而中文版手册只有pdf一种格式。为了国内Sybase用户更方便、快捷地搜索Sybase常见产品的官方手册内容,特将中文版Sybase官方手册转为html格式!
Sybase产品官方手册中文版的html格式所有内容的版权归SAP公司所有!本博客站长是Sybase数据库的铁杆粉丝!

如有Sybase数据库技术问题需要咨询,请联系我!

  QQ :289965371 点击这里给我发消息
  Email:

以下官方手册为ASE 15.7 ESD#2中文版:

  1. 新增功能公告 适用于 Windows、Linux 和 UNIX 的 Open Server 15.7 和 SDK 15.7
  2. 新增功能摘要
  3. 新增功能指南
  4. ASE 15.7 发行公告
  5. 配置指南(windows)
  6. 安装指南(windows)
  7. 参考手册:构件块
  8. 参考手册:命令
  9. 参考手册:过程
  10. 参考手册:表
  11. Transact-SQL® 用户指南
  12. 系统管理指南,卷 1
  13. 系统管理指南,卷 2
  14. 性能和调优系列:基础知识
  15. 性能和调优系列:锁定和并发控制
  16. 性能和调优系列:监控表
  17. 性能和调优系列:物理数据库调优
  18. 性能和调优系列:查询处理和抽象计划
  19. 性能和调优系列:使用 sp_sysmon 监控 Adaptive Server
  20. 性能和调优系列:利用统计分析改进性能
  21. 程序员参考 jConnect for JDBC 7.0.7
  22. Adaptive Server Enterprise 中的 Java
  23. 组件集成服务用户指南
  24. Ribo 用户指南
  25. 内存数据库用户指南
  26. Sybase Control Center for Adaptive Server® Enterprise
  27. 安全性管理指南
  28. 实用程序指南

 


< 上一个 | 内容 | 下一步 >

对结果集使用游标


jConnect 实现许多 JDBC 2.0 游标和更新方法。这些方法使得使用游标以 及根据结果集中的值更新表的数据行变得更加容易。

JDBC 2.0 中, ResultSet 的主要特点在于其类型和并发性。类型和并 发值是 java.sql.ResultSet 接口的一部分,由该接口的 javadoc 描述。

2-5 描述了 jConnect 中提供的 java.sql.ResultSet 的特点。请求时,如果 服务器是 Adaptive Server 15.0 或更高版本,则 jConnect 会打开服务器端 可滚动游标。

image

image

2-5jConnect 中提供的 java.sql.ResultSet 选项 类型

TYPE_FORWARD_

并发 ONLY

TYPE_SCROLL_ INSENSITIVE

TYPE_SCROLL_ SENSITIVE

image

CONCUR_READ_ONLY 支持 支持 不可用

image

CONCUR_UPDATABLE 支持 不可用 不可用

image

本节包括以下主题:


创建游标

使用 JDBC 1.x 方法进行定位型更新和删除

使用 JDBC 2.0 方法进行定位型更新和删除

PreparedStatement 对象使用游标

jConnect 中使用 TYPE_SCROLL_INSENSITIVE 结果集


创建游标


使用 jConnect 创建游标有两种方法:

SybStatement.setCursorName

可使用 SybStatement.setCursorName 显式指定游标名称。

SybStatement.setCursorName 的签名是:

void setCursorName(String name) throws SQLException;

SybStatement.setFetchSize


可使用 SybStatement.setFetchSize 创建游标并指定每次读取操作从数 据库返回的行数。 SybStatement.setFetchSize 的签名是:

void setFetchSize(int rows) throws SQLException;

使用 setFetchSize 创建游标时,jConnect 驱动程序会为游标命名。若 要获取游标名称,请使用 ResultSet.getCursorName

另一种创建游标的方法是在连接上使用以下 JDBC 方法指定希望语句返 回的 ResultSet 的类型:

Statement createStatement(int resultSetType, int resultSetConcurrency)throws SQL Exception

类型和并发值与 2-5 中列出的、在 ResultSet 接口中找到的类型和并发 值相对应。如果请求的是不受支持的 ResultSet,将在连接上链接一个 SQL 警告。执行返回的 Statement 时,您将收到与所请求的类型最接近 的 ResultSet 类型。有关此方法的行为的详细信息,请参见 JDBC 规范。

如果不使用 createStatement,则 ResultSet 的缺省类型是:

如果只调用 Statement.executeQuery,则返回的 ResultSet 是类型和并 发值分别为 TYPE_FORWARD_ONLY CONCUR_READ_ONLY SybResultSet

如果调用 setCursorName,则从 executeQuery 返回的 ResultSet 是类型 和并发值分别为 TYPE_FORWARD_ONLY CONCUR_UPDATABLE SybCursorResultSet


如果调用 setFetchSize,则从 executeQuery 返回的 ResultSet 是类型和 并发值分别为 TYPE_FORWARD_ONLY CONCUR_READ_ONLY SybCursorResultSet

若要检验 ResultSet 对象的类型是否是您所需要的类型,请使用以下两种

ResultSet 方法:

int getConcurrency() throws SQLException; int getType() throws SQLException;


创建和使用游标

1 使用 Statement.setCursorName SybStatement.setFetchSize 创建游标。

2 调用 Statement.executeQuery 为语句打开游标并返回游标结果集。

3 调用 ResultSet.next 读取行并在结果集中定位游标。

下面的示例分别使用上述两种方法创建游标并返回结果集。它还使 用 ResultSet.getCursorName 获取通过 SybStatement.setFetchSize 创建 的游标的名称。

// With conn as a Connection object, create a

// Statement object and assign it a cursor using

// Statement.setCursorName().

Statement stmt = conn.createStatement(); stmt.setCursorName("author_cursor");


// Use the statement to execute a query and return

// a cursor result set.

ResultSet rs = stmt.executeQuery("SELECT au_id, au_lname, au_fname FROM authors

WHERE city = 'Oakland'"); while(rs.next())

{

...

}


// Create a second statement object and use

// SybStatement.setFetchSize()to create a cursor

// that returns 10 rows at a time.

SybStatement syb_stmt = conn.createStatement(); syb_stmt.setFetchSize(10);


// Use the syb_stmt to execute a query and return

// a cursor result set. SybCursorResultSet rs2 =

(SybCursorResultSet)syb_stmt.executeQuery ("SELECT au_id, au_lname, au_fname FROM


authors


WHERE city = 'Pinole'");

while(rs2.next())

{

...

}


// Get the name of the cursor created through the

// setFetchSize() method.

String cursor_name = rs2.getCursorName();

...

// For jConnect 6.0, create a third statement

// object using the new method on Connection,

// and obtain a SCROLL_INSENSITIVE ResultSet.

// Note:you no longer have to downcast the

// Statement or the ResultSet. Statement stmt = conn.createStatement(

ResultSet.TYPE_SCROLL_INSENSITIVE,

ResultSet.CONCUR_READ_ONLY);

ResultSet rs3 = stmt.executeQuery ("SELECT ...[whatever]");

// Execute any of the JDBC 2.0 methods that

// are valid for read only ResultSets. rs3.next();

rs3.previous(); rs3.relative(3); rs3.afterLast();

...


使用 JDBC 1.x 方法进行定位型更新和删除

下面的示例演示如何使用 JDBC 1.x 中的方法进行定位型更新。该示例 创建两个 Statement 对象,一个用于选择游标结果集中的行,另一个用 于通过结果集中的行更新数据库。


// Create two statement objects and create a cursor

// for the result set returned by the first

// statement, stmt1.Use stmt1 to execute a query

// and return a cursor result set. Statement stmt1 = conn.createStatement(); Statement stmt2 = conn.createStatement(); stmt1.setCursorName("author_cursor");

ResultSet rs = stmt1.executeQuery("SELECT au_id,au_lname, au_fname

FROM authors WHERE city = 'Oakland'


FOR UPDATE OF au_lname");


// Get the name of the cursor created for stmt1 so

// that it can be used with stmt2. String cursor = rs.getCursorName();


// Use stmt2 to update the database from the

// result set returned by stmt1.

String last_name = new String("Smith"); while(rs.next())

{

if (rs.getString(1).equals("274-80-9391"))

{

stmt2.executeUpdate("UPDATE authors "+ "SET au_lname = "+last_name +

"WHERE CURRENT OF " + cursor);

}

}


在结果集中删除


下面的示例使用从上述代码中获得的 Statement 对象 stmt2 执行定位型 删除:

stmt2.executeUpdate("DELETE FROM authors WHERE CURRENT OF " + cursor);


使用 JDBC 2.0 方法进行定位型更新和删除

本节介绍一些 JDBC 2.0 方法,可用于更新当前游标行中的列以及通过 结果集中的当前游标行更新数据库。每个方法后面都有一个示例。


在结果集中更新列


JDBC 2.0 提供了多个方法,用于在客户端更新内存中的结果集的列值。 然后可使用更新的值对基础数据库执行更新、插入或删除操作。所有这 些方法都在 SybCursorResultSet 类中实现。

下面是 jConnect 中提供的一些 JDBC 2.0 更新方法:

void updateAsciiStream(String columnName, java.io.InputStream x, int length) throws SQLException;

void updateBoolean(int columnIndex, boolean x) throws SQLException; void updateFloat(int columnIndex, float x) throws SQLException; void updateInt(String columnName, int x) throws SQLException;

void updateInt(int columnIndex, int x) throws SQLException;


void updateObject(String columnName, Object x) throws SQLException;


用于通过结果集更新数据库的方法

JDBC 2.0 指定了两种方法,用于根据结果集中的当前值更新或删除数据 库中的行。这些方法在形式上比 JDBC 1.x 中的 Statement.executeUpdate 简单,并且不需要使用游标名称。它们在 SybCursorResultSet 中实现:

void updateRow() throws SQLException; void deleteRow() throws SQLException;


image

注释 结果集的并发必须是 CONCUR_UPDATABLE。否则上述方法将引 发例外。对于 insertRow,必须指定所有要求非空条目的表列。 DatabaseMetaData 提供的方法决定这些更改何时可见。

image


示例 下面的示例将创建一个用于返回游标结果集的 Statement 对象。对于结 果集中的每一行,列值在内存中更新,然后数据库通过该行的新列值得 到更新。

// Create a Statement object and set fetch size to

// 25. This creates a cursor for the Statement

// object Use the statement to return a cursor

// result set. SybStatement syb_stmt =

(SybStatement)conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);

syb_stmt.setFetchSize(25); SybCursorResultSet syb_rs = (SybCursorResultSet)syb_stmt.executeQuery(

"SELECT * from T1 WHERE ...")


// Update each row in the result set according to

// code in the following while loop. jConnect

// fetches 25 rows at a time, until fewer than 25

// rows are left.Its last fetch takes any

// remaining rows. while(syb_rs.next())

{

// Update columns 2 and 3 of each row, where

// column 2 is a varchar in the database and

// column 3 is an integer. syb_rs.updateString(2, "xyz");

syb_rs.updateInt(3,100);

//Now, update the row in the database. syb_rs.updateRow();


}

// Create a Statement object using the

// JDBC 2.0 method implemented in jConnect 6.0 Statement stmt = conn.createStatement

(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);

// In jConnect 6.0, downcasting to SybCursorResultSet is not

// necessary.Update each row in the ResultSet in the same

// manner as above while(rs.next())

{

rs.updateString(2, "xyz"); rs.updateInt(3,100);

rs.updateRow();

// Use the Statement to return an updatable ResultSet ResultSet rs = stmt.executeQuery("SELECT * FROM T1 WHERE...");

}


ResultSet 中删除行


若要从游标结果集中删除某一行,可按如下方式使用

SybCursorResultSet.deleteRow


while(syb_rs.next())

{

int col3 = getInt(3); if (col3 >100)

{

syb_rs.deleteRow();

}

}


ResultSet 中插入行


下面的示例说明如何使用 JDBC 2.0 API 执行插入操作。不需要使用

SybCursorResultSet

// prepare to insert rs.moveToInsertRow();

// populate new row with column values rs.updateString(1, "New entry for col 1"); rs.updateInt(2, 42);

// insert new row into db rs.insertRow();

// return to current row in result set rs.moveToCurrentRow();


在游标关闭时释放锁


Adaptive Server 15.7 扩展了 declare cursor 语法,使其包括 release_locks_on_close 选项,用以在游标关闭时在隔离级别 2 3 释放 共享游标锁。 jConnect release-lock-on-close 的语义提供相应支持。

要在 jConnect 连接上应用,请将 RELEASE_LOCKS_ON_CURSOR_CLOSE 连接属性设置为 trueRELEASE_LOCKS_ON_CURSOR_CLOSE 的缺省值为 false

此设置只有在连接到支持 release_locks_on_close 的服务器时才会生效。 有关 release_locks_on_close 的信息,请参见 Adaptive Server Enterprise

《参考手册:命令》


select for update 支持

Adaptive Server 15.7 支持 select for update,它可以为同一事务内的后续更新 锁定行,并支持可更新游标的排它锁。请参见 Adaptive Server Enterprise

Transact-SQL 用户指南》中的第 2 章 “查询:从表中选择数据”。

for update 子句添加到 select 语句以及客户端内打开的任何可更新游标 中后,此功能便可自动供客户端使用。


PreparedStatement 对象使用游标

PreparedStatement 对象在创建后可以多次使用,每次使用时可为其输入 参数指定相同或者不同的值。如果为 PreparedStatement 对象使用游标, 则每次使用完游标后必须将其关闭,下次使用时再将其重新打开。关闭 游标的结果集 (ResultSet.close) 时也会关闭该游标。执行游标的预准备语 句 (PreparedStatement.executeQuery) 时会打开该游标。

下面的示例演示如何创建 PreparedStatement 对象,如何为其指定游标, 以及如何执行两次 PreparedStatement 对象 (关闭然后重新打开游标)。

// Create a prepared statement object with a

// parameterized query. PreparedStatement prep_stmt = conn.prepareStatement(

"SELECT au_id, au_lname, au_fname "+ "FROM authors WHERE city = ?"+

"FOR UPDATE OF au_lname");


//Create a cursor for the statement. prep_stmt.setCursorName("author_cursor");


// Assign the parameter in the query a value.


// Execute the prepared statement to return a

// result set. prep_stmt.setString(1, "Oakland");

ResultSet rs = prep_stmt.executeQuery();


//Do some processing on the result set. while(rs.next())

{

...

}


// Close the result, which also closes the cursor. rs.close();


// Execute the prepared statement again with a new

// parameter value. prep_stmt.setString(1,"San Francisco"); rs = prep_stmt.executeQuery();

// reopens cursor


jConnect 中使用 TYPE_SCROLL_INSENSITIVE 结果集

jConnect 仅支持 TYPE_SCROLL_INSENSITIVE 结果集。

jConnect 使用 Tabular Data Stream (TDS) (即 Sybase 专有协议)与 Sybase 数据库服务器进行通信。 Adaptive Server 15.0 或更高版本支持 TDS 可滚动游标。对于不支持 TDS 可滚动游标的服务器,在每次调用 ResultSet.next 时, jConnect 都会在客户端按需高速缓存行数据。但到达 结果集的末尾时,整个结果集将存储到客户端内存中。因为这可能导致 性能降低,所以 Sybase 建议您仅在使用 Adaptive Server 15.0 或结果集相 当小时才使用 TYPE_SCROLL_INSENSITIVE 结果集。


image

注释 jConnect 中使用 TYPE_SCROLL_INSENSITIVE ResultSets 时, 如果服务器不支持 TDS 可滚动游标,则只能在读取完 ResultSet 的最后 一行后才能调用 isLast 方法。在未达到最后一行时调用 isLast 会导致抛 出 UnimplementedOperationException

image


jConnect sample2 目录中提供了 ExtendResultSet;此示例使用 JDBC

1.0 接口提供了一个受限制的 TYPE_SCROLL_INSENSITIVE ResultSet

此实现使用标准 JDBC 1.0 方法生成无滚动功能的只读结果集,即基础 数据的一个静态视图,它不会即时反映在结果集为打开状态时所进行的 更改。 ExtendedResultSet 在客户端高速缓存所有 ResultSet 行。对较大的 结果集使用此类时应谨慎。

sample.ScrollableResultSet 接口:

JDBC 1.0 java.sql.ResultSet 的扩展。

定义了与 JDBC 2.0 java.sql.ResultSet 具有相同签名的其它方法。

包含部分 JDBC 2.0 方法。未包含其中用于修改 ResultSet 的方法。 来自 JDBC 2.0 API 的方法有:

boolean previous() throws SQLException; boolean absolute(int row) throws SQLException; boolean relative(int rows) throws SQLException; boolean first() throws SQLException;

boolean last() throws SQLException; void beforeFirst() throws SQLException; void afterLast() throws SQLException; boolean isFirst() throws SQLException;


boolean isLast() throws SQLException; boolean isBeforeFirst() throws SQLException; boolean isAfterLast() throws SQLException; int getFetchSize() throws SQLException;

void setFetchSize(int rows) throws SQLException; int getFetchDirection() throws SQLException; void setFetchDirection(int direction) throws SQLException;

int getType() throws SQLException;

int getConcurrency() throws SQLException; int getRow() throws SQLException;

若要使用示例类,请使用任意 JDBC 1.0 java.sql.ResultSet 创建一个

ExtendedResultSet。以下为相关的代码段 (假定为 Java 1.1 环境):

// import the sample files import sample.*;

//import the JDBC 1.0 classes import java.sql.*;

// connect to some db using some driver;

// create a statement and a query;

// Get a reference to a JDBC 1.0 ResultSet ResultSet rs = stmt.executeQuery(_query);

// Create a ScrollableResultSet with it ScrollableResultSet srs = new ExtendedResultSet(rs);

// invoke methods from the JDBC 2.0 API srs.beforeFirst();

// or invoke methods from the JDBC 1.0 API if (srs.next())

String column1 = srs.getString(1);

2-1 是一个类框图,显示了示例类和 JDBC API 之间的关系。


2-1:类框图


image

java.sql.ResultSet

(JDBC 1.0 API)


扩展


sample.ScrollableResultSet

(添加来自 JDBC 2.0 API 的一些方法)


实现


sample.ExtendedResultSet

java.sql.ResultSet 的包装)


有关详细信息,请参见 JDBC 2.0 API,网址为: http://www.oracle.com/technetwork/java/javase/jdbc




--------------------------------------华丽的分割线-------------------------------------------------------------------------
之前就已经研发成功了能够从Sybase SQL Anywhere的DB文件中恢复数据的工具:ReadASADB。
此工具支持ASA v5.0,v6.0,v7.0,v8.0,v9.0,v10.0,v11.0,v12.0等版本。
恢复Sybase SQL Anywhere的工具在国内应该算首创。

ReadASADB功能
能够从损坏的SQL Anywhere数据文件(.db)和UltraLite数据文件(.udb)上提取数据的非常规恢复工具

  1. 适用于所有的SQL Anywhere版本    包括:5.x,6.x,7.x,8.x,9.x,10.x,11.x,12.x
  2. 适用于所有的UltraLite版本
  3. 能够恢复出来表结构和数据
  4. 能够恢复自定义数据类型
  5. 能够恢复存储过程等对象的语法
  6. 能够导出到目标数据库
  7. 能够导出到SQL文件并生成导入脚本
  8. 支持多种字符集  包括:cp850、cp936、gb18030、utf8等
  9. 能够恢复未加密或者简单加密类型的数据
  10. 简单易用
  11. 限制:不支持AES加密的数据文件
请参考:研发成功了从Sybase SQL Anywhere的DB文件上恢复数据的工具
            SQL Anywhere数据库非常规恢复工具ReadASADB使用介绍

ReadASADB适用场景

各种误操作:

  1. 误截断表(truncate table)
  2. 误删除表(drop table)
  3. 错误的where条件误删数据
  4. 误删除db或log文件
  5. 误删除表中的字段

本工具的应用场景:

1.因为物理磁盘故障、操作系统、系统软件方面或者掉电等等原因导致的Sybase SQL Anywhere数据库无法打开的情况;
2.误操作,包括truncate table,drop table,不正确的where条件导致的误删除等;
Sybase SQL Anywhere无法打开时,比较常见的错误是:Assertion failed。
如:
1、Internal database error *** ERROR *** Assertion failed:201819 (8.0.1.2600) Checkpoint log: invalid bitmap page -- transaction rolled back
2、Internal database error *** ERROR *** Assertion failed:201819 (8.0.1.2600) Page number on page does not match page requested -- transaction rolled back
3、Internal database error *** ERROR *** Assertion failed:200502 (9.0.2.2451) Checksum failure on page 23 -- transaction rolled back
4、File is shorter than expected
5、Internal database error *** ERROR *** Assertion failed: 201116 Invalid free list index page found while processing checkpoint log -- transaction rolled back
6、*** ERROR *** Assertion failed: 51901 Page for requested record not a table page or record not present on page等等。
+-------------------------------------华丽的分割线-------------------------------------------------------------------------