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

SAP Sybase SQL Anywhere 16.0 (中文) » MobiLink - 客户端管理 » 用于 MobiLink 的 SQL Anywhere 客户端 » 脚本式上载 » 教程:使用脚本式上载

 

第 3 课:处理插入

您需要定义用于处理上载的存储过程和其它项目。需要分别为插入、删除和更新定义。

前提条件

本课假定您拥有在本教程(教程:使用脚本式上载)开头的“特权”部分中列出的角色和特权。

本课假定您已完成前面的所有课程。 请参见第 1 课:创建统一数据库

 任务
  1. 使用连接到远程数据库的 Interactive SQL 实例,创建一个触发器,此触发器使用下列 SQL 在插入每一行时为其设置 insert_time。

    CREATE TRIGGER emp_ins AFTER INSERT ON employee
    REFERENCING NEW AS newrow
    FOR EACH ROW
    BEGIN
        UPDATE employee SET insert_time = CURRENT TIMESTAMP
        WHERE id = newrow.id
    END;

    此时间戳用于确定自上次同步以来是否插入了行。在 dbmlsync 应用从统一数据库下载的插入时将不触发此触发器,因为在此示例中稍后会将 FireTriggers 扩展选项设置为 off。通过下载插入的行所获得的 insert_time 值为 1900-01-01,这是创建 employee 表时定义的缺省值。此值应始终早于开始进度,以使这些行不会被视为新插入行,也不会在下一同步期间上载。

  2. 仍然在远程数据库中创建一个以结果集形式返回所有要上载的插入行的过程。



    CREATE PROCEDURE employee_insert()
    RESULT( id  unsigned integer,
              name varchar( 256 ),
              salary numeric( 9,2 )
          )
    BEGIN
        DECLARE start_time timestamp;
    
        SELECT value
        INTO start_time
        FROM #hook_dict
        WHERE name = 'start progress as timestamp';
    
        // Upload as inserts all rows inserted after the start_time
        // that were not subsequently deleted
        SELECT id, name, salary
        FROM employee e
        WHERE insert_time > start_time AND
           NOT EXISTS( SELECT id FROM employee_delete ed  WHERE ed.id = e.id );
    
    END;

结果

此过程返回所有自上次成功上载以来(根据 insert_time)插入但随后未删除的行。上次成功上载的时间由 #hook_dict 表中的 start progress 值确定。此示例使用 dbmlsync 扩展选项 LockTables 的缺省设置,该设置可使 dbmlsync 锁定正在同步的表。因此,不必排除结束进度后插入的行:在构建上载时,表锁定可防止在结束进度后发生任何操作。

下一个

前进至第 4 课:处理更新