定义游标以选择要从远程数据库中删除的行。
在下表中,说明部分提供 SQL 数据类型。如果您使用 Java 或 .NET 编写脚本,则应该使用相应的数据类型。请参见SQL-Java 数据类型和SQL-.NET 数据类型。
在 SQL 脚本中,可以使用名称或问号指定事件参数,但不能在一个脚本中混合使用名称和问号。如果使用问号,则参数必须按照如下所示的顺序并且仅当没有指定任何后继参数时才是可选的(例如,如果您想使用参数 2,则必须使用参数 1)。如果使用命名参数,则可以按照任何顺序指定任意参数子集。
SQL 脚本的参数名称 |
说明 |
顺序 |
---|---|---|
s.last_table_download |
TIMESTAMP。表的上一次下载时间。 |
1 |
s.remote_id | VARCHAR(128)。MobiLink 远程 ID。只有在使用命名参数时才能引用远程 ID。 | 不适用 |
s.username |
VARCHAR(128)。MobiLink 用户名。 |
2 |
无。
MobiLink 服务器打开一个只读游标,并使用此游标读取将要在远程数据库中下载然后插入或更新的行的列表。此脚本必须包含一个 SELECT 语句,该语句必须能够返回将要从远程数据库的表中删除的行的主键值。
您可以为远程数据库的每个表编写一个 download_delete_cursor 脚本。
如果在 download_delete_cursor 中某个表的一个或多个行的主键列为空,则 MobiLink 将通知远程数据库删除该表中的所有数据。请参见删除表中的所有行。
注意,统一数据库中删除的行不出现在 download_delete_cursor 事件定义的结果集中,因此不会从远程数据库中自动删除。一个用于标识将要从远程数据库中删除的行的方法是向统一数据库表添加一列,用以将行标识为非活动。
为了避免下载不必要的行,您应该在 download_delete_cursor 脚本的 WHERE 子句中包括以下行:
AND last_modified > '1900/1/1' |
对于 Java 和 .NET 应用程序,此脚本必须返回有效的 SQL。
在 download_delete_cursor 中使用 READPAST 表提示可能会有问题。有关详细信息,请参见 download_cursor 事件。
此示例来自 Contact 示例,并可在 Samples\MobiLink\Contact\build_consol.sql 中找到。它从远程数据库中删除满足下列条件的所有客户:自从上次该用户下载数据后已更改 (Customer.last_modified >= {ml s.last_table_download}
),并且
不属于正在同步的用户 (SalesRep.username != {ml s.username}
),或者
在统一数据库中被标记为非活动状态 (Customer.active = 0
)。
CALL ml_add_table_script( 'ver1', 'table1', 'download_delete_cursor', 'SELECT cust_id FROM Customer key join SalesRep WHERE Customer.last_modified >= {ml s.last_table_download} AND ( SalesRep.username != {ml s.username} OR Customer.active = 0 )') |
以下对 MobiLink 系统过程的调用在同步脚本版本 ver1 时将名为 downloadDeleteCursor 的 Java 方法注册为 download_delete_cursor 事件的脚本。
CALL ml_add_java_table_script( 'ver1', 'table1', 'download_delete_cursor', 'ExamplePackage.ExampleClass.downloadDeleteCursor' ) |
以下是 Java 方法 downloadDeleteCursor 示例。它调用的 Java 方法可以生成下载删除游标的 SQL。
public String downloadDeleteCursor( Timestamp ts, String user ) { return( getDownloadCursor( _curUser, _curTable ) ); } |
以下对 MobiLink 系统过程的调用在同步脚本版本 ver1 和表 table1 时将名为 DownloadDeleteCursor 的 .NET 方法注册为 download_delete_cursor 表事件的脚本。
CALL ml_add_dnet_table_script( 'ver1', 'table1', 'download_delete_cursor', 'TestScripts.Test.DownloadDeleteCursor' ) |
以下是 .NET 方法 DownloadDeleteCursor 示例。它调用的 .NET 方法可以生成下载删除游标的 SQL。
public string DownloadDeleteCursor( DateTime timestamp, string user ) { return( GetDownloadCursor( _curUser, _curTable ) ); } |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |