游标的用途不仅仅是读取查询的结果集。您还可以在处理游标时修改数据库中的数据。这些操作通常称为定位插入、更新和删除操作,或者如果操作是插入操作,则称为 PUT 操作。
并非所有的查询结果集都允许定位更新和删除。如果您在不可更新的视图上执行查询,则基础表不会发生更改。此外,如果查询涉及连接,则必须指定您希望从哪一个表删除,或者您希望更新哪些列,何时执行操作。
只有在表中的某些非插入列允许 NULL 或有缺省值的情况下,才能通过游标执行插入。
将多行插入对值敏感的游标(由键集决定的游标)时,新插入的行出现在游标结果集的末尾处。即使这些行与查询的 WHERE 子句不匹配,或者 ORDER BY 子句通常将它们放置在结果集的其它位置,这些行也会出现在最后。此行为与编程接口无关。例如,当使用嵌入式
SQL PUT 语句或 ODBC SQLBulkOperations 函数时就会是这样。通过选择游标中最后一行可以找到最后插入行的自动增量列的值。例如,在嵌入式 SQL 中,可以使用 [FETCH ABSOLUTE -1 cursor-name
] 来获取该值。此行为的结果是,对值敏感的游标的首次多行插入的开销会很大。
ODBC、JDBC、嵌入式 SQL 和 Open Client 允许使用游标进行数据修改,但 ADO.NET 不允许。对于 Open Client,您可以删除和更新行,但您只能在单表查询上插入行。
如果您试图通过游标执行定位删除,那么请按如下所示的方法确定从哪个表删除行:
如果 DELETE 语句中未包括 FROM 子句,那么游标必须只在单个表上。
如果游标用于连接式查询(包括使用含有连接的视图),则必须使用 FROM 子句。只会删除指定表的当前行,连接中涉及的其它表不会受到影响。
如果包括了 FROM 子句,但未指定表所有者,那么指定表为第一个与其值相匹配的相关名。请参见FROM 子句。
如果给出了相关名,就用该相关名来确定指定表的名称。
如果没有给出相关名,那么指定表的名称必须是游标中可明确标识的表名。
如果给出的 FROM 子句中指定了表的所有者,那么指定表的名称必须像游标中的表名一样是明确可标识的。
定位 DELETE 语句可以使用于在视图上打开的游标,只要视图是可更新的即可。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |