Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - 编程 » 使用 SQL Anywhere 编程简介 » 在应用程序中使用 SQL » 使用游标

 

通过游标修改行

游标的用途不仅仅是读取查询的结果集。您还可以在处理游标时修改数据库中的数据。这些操作通常称为定位插入、更新和删除操作,或者如果操作是插入操作,则称为 PUT 操作。

并非所有的查询结果集都允许定位更新和删除。如果您在不可更新的视图上执行查询,则基础表不会发生更改。此外,如果查询涉及连接,则必须指定您希望从哪一个表删除,或者您希望更新哪些列,何时执行操作。

只有在表中的某些非插入列允许 NULL 或有缺省值的情况下,才能通过游标执行插入。

将多行插入对值敏感的游标(由键集决定的游标)时,新插入的行出现在游标结果集的末尾处。即使这些行与查询的 WHERE 子句不匹配,或者 ORDER BY 子句通常将它们放置在结果集的其它位置,这些行也会出现在最后。此行为与编程接口无关。例如,当使用嵌入式 SQL PUT 语句或 ODBC SQLBulkOperations 函数时就会是这样。通过选择游标中最后一行可以找到最后插入行的自动增量列的值。例如,在嵌入式 SQL 中,可以使用 [FETCH ABSOLUTE -1 cursor-name] 来获取该值。此行为的结果是,对值敏感的游标的首次多行插入的开销会很大。

ODBC、JDBC、嵌入式 SQL 和 Open Client 允许使用游标进行数据修改,但 ADO.NET 不允许。对于 Open Client,您可以删除和更新行,但您只能在单表查询上插入行。

可以从哪个表中删除行?

如果您试图通过游标执行定位删除,那么请按如下所示的方法确定从哪个表删除行:

  1. 如果 DELETE 语句中未包括 FROM 子句,那么游标必须只在单个表上。

  2. 如果游标用于连接式查询(包括使用含有连接的视图),则必须使用 FROM 子句。只会删除指定表的当前行,连接中涉及的其它表不会受到影响。

  3. 如果包括了 FROM 子句,但未指定表所有者,那么指定表为第一个与其值相匹配的相关名。请参见FROM 子句

  4. 如果给出了相关名,就用该相关名来确定指定表的名称。

  5. 如果没有给出相关名,那么指定表的名称必须是游标中可明确标识的表名。

  6. 如果给出的 FROM 子句中指定了表的所有者,那么指定表的名称必须像游标中的表名一样是明确可标识的。

  7. 定位 DELETE 语句可以使用于在视图上打开的游标,只要视图是可更新的即可。