分类: Sybase
2008-04-11 11:04:24
来源:赛迪网 作者:limeinan |
多行读取
某些接口提供了一次将多行读取到数组中的下几个字段的方法。通常,您执行单独的读取操作越少,服务器必须响应的单个请求也就越少,性能也就越好。修改后的检索多行的 FETCH 语句有时也称为宽读取。使用多行读取的游标有时称为块状游标或胖游标。
使用多行读取
在 ODBC 中,您可以通过设置 SQL_ROWSET_SIZE 属性来设置每一次调用 SQLFetchScroll 或 SQLExtendedFetch 返回的行数。
在嵌入式 SQL 中, FETCH 语句使用 ARRAY 子句控制一次读取的行数。
Open Client 和 JDBC 不支持多行读取。但它们可以使用预读。
用可滚动游标读取
ODBC 和嵌入式 SQL 提供了使用可滚动游标和动态可滚动游标的方法。
这些方法使您能够一次向前移动多行,或在结果集中向后移动。
JDBC 和 Open Client 接口不支持可滚动游标。
预读不适用于可滚动操作。例如,读取相反方向中的行并不能预读前面的多行。
通过游标修改行
游标的用途不仅仅是读取查询的结果集。您还可以在处理游标时修改数据库中的数据。这些操作通常称为定位插入、更新和删除操作,或者如果操作是插入操作,则称为 PUT 操作。
并非所有的查询结果集都允许定位更新和删除。如果您在不可更新的视图上执行查询,则基表不会发生更改。此外,如果查询涉及连接,则必须指定您希望从哪一个表删除,或者您希望更新哪些列,何时执行操作。
只有在表中的某些非插入列允许 NULL 或有缺省值的情况下,才能通过游标执行插入。
将多行插入对值敏感的游标 (键集驱动的游标)时,新插入的行出现在游标结果集的末尾处。即使这些行与查询的 WHERE 子句不匹配,或者 ORDER BY 子句通常将它们放置在结果集的其它位置,这些行也会出现在最后。此行为与编程接口无关。例如,当使用嵌入式 SQL PUT语句或 ODBC SQLBulkOperations 函数时就会是这样。通过选择游标中最后一行可以找到最后插入行的自动增量列的值。例如,在嵌入式 SQL中,可以使用 FETCH ABSOLUTE -1 cursor-name 来获取该值。此行为的
结果是,对值敏感的游标的首次多行插入的代价会很大。
ODBC、嵌入式 SQL 和 Open Client 允许使用游标进行数据修改,JDBC 1.1 却不允许。对于 Open Client,您可以删除和更新行,但您只能在单表查询上插入行。
可以从哪个表中删除行?
如果您试图通过游标执行定位删除,那么请按如下所示的方法确定从哪个表删除行:
1. 如果 DELETE 语句中未包括 FROM 子句,那么游标必须只在单个表上。
2. 如果游标用于连接查询 (包括使用包含连接的视图),则必须使用FROM 子句。只会删除指定表的当前行,连接中涉及的其它表不会受到影响。
3. 如果包括了 FROM 子句,但未指定表所有者,那么指定表为第一个与其值相匹配的相关名。
4. 如果给出了相关名,就用该相关名来确定指定表的名称。
5.如果没有给出相关名,那么指定表的名称必须是游标中可明确标识的表名。
6.如果给出的 FROM 子句中指定了表的所有者,那么指定表的名称必须像游标中的表名一样是明确可标识的。
7. 定位 DELETE 语句可以使用于在视图上打开的游标,只要视图是可更新的即可。
取消游标操作
您可以通过接口函数取消请求。从 Interactive SQL 中,您可以通过按下工具栏上的 " 中断 SQL 语句 " 按钮 (或者通过从 SQL 菜单中选择 " 停止 ")来取消请求。
如果您取消正在执行游标操作的请求,则游标的位置是不确定的。取消请求之后,您必须按照其绝对位置给游标定位,或者将它关闭。 |