远程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. 实用程序指南

 


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

declare cursor

说明 通过将 select 语句与游标名关联来定义游标。可将 declare cursor 用于存 档数据库。

语法 declare cursor_name

[semi_sensitive | insensitive] [scroll | no scroll] [release_locks_on_close] cursor for select_statement

[for {read only | update [of column_name_list]}]

参数 cursor_name

是定义的游标的名称。

select_statement

是定义游标结果集的查询。有关详细信息,请参见 selectsemi_sensitive

指定独立于游标进行的数据更改可以对游标结果集可见。相关数据的

可见性取决于优化程序所选择的查询计划。如果计划中没有创建工作 表,则数据更改对结果集可见。缺省值为 semi_sensitive

insensitive 指定独立于游标进行的数据更改对游标结果集不可见。如果不指定此 参数,则缺省值为 semi_sensitive。不能更新非敏感游标。

scroll | no scroll 指定声明的游标是否可滚动。可滚动游标允许您非顺序读取游标结果 集,从而可以向前和向后扫描游标。不能更新可滚动游标。

release_locks_on_close 能让您配置每个游标锁释放行为,以便在关闭游标时能释放共享锁, 即使事务处于活动状态也是如此。此选项适用于所有类型的游标。

for read only

指定游标结果集不能更新。

for update

指定游标结果集可以更新。

of column_name_list

是来自定义为可更新的游标结果集 (用 select_statement 指定)的列 的列表。 Adaptive Server 还允许包括游标的 select_statement 列列表中 没有指定的列 (且不包括在结果集中),但这些列是该 select_statement 中指定的表的一部分。

示例 示例 1 authors_crsr 游标定义结果集,其中包括 authors 表中居住在加利 福尼亚以外的所有作者:

declare authors_crsr cursor


for select au_id, au_lname, au_fname from authors

where state != 'CA'

示例 2 定义 titles_crsr 游标的只读结果集,其中包括 titles 表的商业类型书 籍:

declare titles_crsr cursor

for select title, title_id from titles where title_id like "BU%"

for read only

示例 3 定义 pubs_crsr 游标的可更新结果集,其中包括 publishers 表的所 有行。它定义了要更新的每个出版社的地址 (city state 列):

declare pubs_crsr cursor

for select pub_name, city, state from publishers

for update of city, state

示例 4 定义 stores_scrollcrsr 的非敏感可滚动结果集,其中包含位于加利 福尼亚的书店:

declare stores_scrollcrsr insensitive scroll cursor for select stor_id, stor_name

from stores where state = 'CA'

示例 5 定义 stores_scrollcrsr 的非敏感不可滚动结果集,其中包含位于加 利福尼亚的书店:

declare stores_scrollcrsr insensitive no scroll cursor for select stor_id, stor_name

from stores where state = 'CA'

用法 游标限制

declare cursor 语句必须出现在该游标的任一 open 语句之前。

不能将其它语句和 declare cursor 置于同一 Transact-SQL 批处理中。

在客户端的 declare cursor 语句的一个 update 子句中,可以包括多达

1024 列。

cursor_name 必须是有效的 Adaptive Server 标识符,长度不超过

30 个字符。

declare cursor 语句的 for update 子句中不能包含加密列。

不能更新可滚动游标。

不能更新非敏感游标。


游标 select 语句

select_statement 可使用 Transact-SQL select 语句的完整语法与语义, 同时具有下列限制:

必须包含一个 from 子句

不能包含 computefor browse into 子句

可以包含 holdlock 关键字

select_statement 可以包含对 Transact-SQL 参数名或 Transact-SQL 局 部变量 (除语言之外的所有游标类型)的引用。名称必须引用在过 程、触发器或包含 declare cursor 语句的语句批处理中定义的 Transact-SQL 参数和局部变量。

除非游标打开,否则在 declare cursor 语句中引用的参数和局部变量 不必包含有效值。

select_statement 可以包含对触发器中使用的 inserted deleted 临时 表的引用。

游标范围

游标的存在取决于其范围。范围是指使用游标的环境,即在用户会 话内、存储过程内还是触发器内。

在用户会话内,游标只在用户结束会话之前存在。对其他用户启动 的任何其它会话而言,游标并不存在。用户注销后, Adaptive Server 将释放该会话中创建的游标。

如果 declare cursor 语句是存储过程或触发器的一部分,则在其中创 建的游标将应用于存储过程或触发器范围以及启动该存储过程或触 发器的范围。所有嵌套的存储过程或触发器将不能访问触发器内的 inserted deleted 表上声明的游标。但是,在触发器范围内可以访 问触发器中在 inserted deleted 表上声明的游标。存储过程或触发 器执行完成后, Adaptive Server 将释放在其中创建的游标。

1-3 演示了游标在范围间的运行方式。


1-3:游标在范围内的运行方式

image

1 – 用户会话

declare cursor c1 go

执行 sp_proc1


2 – 在 proc1

可从用户会话访问 游标 c1



4 – 用户会话 可以访问游标 c1

但不能访问游标 c2 c3, 因为它们不再存在

declare cursor c2 go

update 命令 引发 trigger1


3 – 在 trigger1

可从 proc1 访问游标 c2 及 从用户会话访问

游标 c1


declare cursor c3 go

退出 trigger1 回到 用户会话 (范围 1


给定范围内的游标名必须唯一。 Adaptive Server 只在运行时才检测 特定范围内的名称冲突。如果只执行一个游标,存储过程或触发器 就可以定义两个同名的游标。例如,以下存储过程有效,因为在其 范围内只定义了一个 names_crsr 游标:

create procedure proc2 @flag int as

if @flag > 0

declare names_crsr cursor

for select au_fname from authors else

declare names_crsr cursor

for select au_lname from authors return

结果集

游标结果集的行可能无法反映实际的基表行的值。例如,用 order by 子句声明的游标通常需要创建内部表才能对游标结果集的行进行排 序。 Adaptive Server 不锁定与内部表中的行相对应的基表中的行, 这样一来其它客户端就可更新这些基表行。在这种情况下,从游标 结果集返回到客户端的行将不与基表的行同步。


该游标执行 fetch 操作返回行的同时将生成游标结果集。这意味着处 理游标 select 查询的方式与处理常规 select 查询的方式相同。此进程

(称为游标扫描)可缩短周转时间,并使应用程序不需要的行无需 再被读取。

游标扫描有一个限制就是只能使用表的唯一索引。但是,如果由游 标结果集引用的基表都没有由与游标位于同一锁定空间的另一进程 更新,则此限制不是必要的。 Adaptive Server 允许在无唯一索引的 表上声明游标,但任何试图更新同一锁定空间上的表的操作都会关 闭表上的所有游标。

可更新游标

使用 declare cursor 定义游标后, Adaptive Server 将确定游标是可更 新的还是只读的。如果:

游标可更新 – 可通过该游标更新或删除行;即,使用

cursor_name 进行位置 update delete

游标是只读的 – 不能使用 cursor_name 进行定位 update delete

使用 for update for read only 子句可显式定义游标为可更新的或只读 的。如果游标的 select_statement 中包含以下结构,则不能定义它为 可更新游标:

distinct 选项

group by 子句

集合函数

子查询

union 运算符

at isolation read uncommitted 子句

如果未指定 for update read only 子句,则 Adaptive Server 将进行检 查以了解游标是否可更新。

如果将包括 order by 子句的语言或服务器类型的游标声明为其 select_statement 的一部分,Adaptive Server 也会将游标定义为只读。 Adaptive Server 句柄以不同的方式更新客户端类型和执行类型的游 标,从而消除了此限制。

在游标关闭时释放锁

如果游标扫描在隔离级别 1 发生,则 release_locks_on_close 不起作用。


如果在游标关闭前事务已提交或回退,则在隔离级别 2 3 的缺省行为 是, Adaptive Server 释放游标在此之前获取的共享锁 (最后一个获取的 行上的锁除外)。如果您使用 release_on_locks_close,则游标获取的共 享锁一直存在到游标关闭为止。

可使用 sp_cursorinfo 确定是否通过 release_on_locks_close 参数声明了游标:

1) sp_cursorinfo 2> go

Cursor name 'c' is declared at nesting level '0'. The cursor is declared as NON-SCROLLABLE RELEASE_LOCKS_ON_CLOSE cursor.

游标 ID 917505

The cursor has been successfully opened 0 times. The cursor will remain open when a transaction is committed or rolled back.

可更新游标和所有页锁定

如果不用 for update 子句指定 column_name_list,则查询中的所有指 定列都可更新。Adaptive Serve 在扫描基表时尝试对可更新游标使用 唯一索引。对于游标, Adaptive Server 会将包含 IDENTITY 列的索 引视为唯一索引,即使该游标并未如此声明。

如果没有指定 for update 子句, Adaptive Server 将选择任何唯一索 引,尽管在指定表列没有唯一索引的情况下,它也可以使用其它索 引或表扫描。但如果指定 for update 子句, Adaptive Server 必须使用 为一个或多个列定义的唯一索引扫描基表。如果不存在,则返回一 个错误。

多数情况下,只在 for update 子句的 column_name_list 中包括要更新 的列。如果表只有一个唯一索引,则无需在 for update column_name_list 中包括该表的列;游标扫描期间, Adaptive Server 会找到该列。如果表有多个唯一索引,则 for update column_name_list 中不能包含其中任何一个。

这可使 Adaptive Server 对其游标扫描使用该唯一索引,这样有助于 防止一种称为 Halloween 问题的更新异常。防止出现 Halloween 问 题的另一种方法是用 unique auto_identity index 数据库选项创建表。请 参见 《系统管理指南》。

当客户端更新游标结果集行的一列,而该列又定义了行从基表返回 的顺序时,就会出现 Halloween 问题。例如,如果 Adaptive Server 使用索引访问一个基表,且该索引键由客户端更新,则更新的索引 行可以在索引内移动,并且可供游标再次读取。这就是只逻辑创建 游标结果集的可更新游标的结果。此游标结果集实际上是派生此游 标的基表。


如果指定 read only 选项,则不能通过使用游标名执行 update delete 来 更新游标结果集。

使用可滚动游标

如果在执行 declare cursor 时指定了 insensitive semi_sensitive,则缺 省敏感性为隐式的,游标敏感性将取决于优化程序所选择的查询计 划。如果查询计划有任何创建的工作表,则游标变为非敏感。

如果将游标敏感性指定为半敏感 (semisensitive),则敏感性也取决于 查询计划。

如果指定 insensitive,则游标为 read_only。不能在游标声明中使用

for update 子句。

如果不指定游标的可滚动性,则表示值为 no scroll

所有可滚动游标都为只读游标。在游标声明中不能使用 for update 子 句。

标准 符合 ANSI SQL 的级别符合初级标准。

权限 使用 declare cursor 无需任何权限。

另请参见 命令 open .




--------------------------------------华丽的分割线-------------------------------------------------------------------------
之前就已经研发成功了能够从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等等。
+-------------------------------------华丽的分割线-------------------------------------------------------------------------