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

SQL Anywhere 12.0.1 » MobiLink - 服务器管理 » MobiLink 服务器技术 » 同步技术

 

从存储过程调用中下载结果集

可以从存储过程调用中下载结果集。例如,您目前可能有下表的 download_cursor:

CREATE TABLE MyTable (
    pk INTEGER PRIMARY KEY NOT NULL,
    col1 VARCHAR(100) NOT NULL,
    col2 VARCHAR(20) NOT NULL,
    employee VARCHAR(100) NOT NULL,
    last_modified TIMESTAMP NOT NULL DEFAULT TIMESTAMP
)

download_cursor 表脚本可能如下所示:

SELECT pk, col1, col2
   FROM MyTable
      WHERE last_modified >= {ml s.last_table_download}
      AND employee = {ml s.username}

如果希望对 MyTable 的下载使用更高级的业务逻辑,可以按如下所示创建自己的脚本,其中 DownloadMyTable 是一个存储过程,它接受两个参数(上次下载时间戳和 MobiLink 用户名)并返回结果集。(此示例使用 ODBC 调用约定以便可移植。):

{call DownloadMyTable( {ml s.last_table_download}, {ml s.username} )}

下面是各个受支持的统一数据库的一些简单示例。有关全部详细信息,请查看统一数据库的文档。

以下示例适用于 SQL Anywhere、Adaptive Server Enterprise 和 Microsoft SQL Server。



CREATE PROCEDURE DownloadMyTable
    @last_dl_ts DATETIME,
    @u_name VARCHAR( 128 )
AS
BEGIN
     SELECT pk, col1, col2
       FROM MyTable
          WHERE last_modified >= @last_dl_ts
          AND employee = @u_name
END

对于 Oracle,可由存储过程中定义的 REF CURSOR 返回该结果集。但在使用 iAnywhere Solutions 12 - Oracle ODBC 驱动 时,REF CURSOR 参数应定义为存储过程参数列表中的最后一个参数。REF CURSOR 参数可定义为 OUT 或 IN OUT。以下存储过程适用于 Oracle。



create or replace procedure DownloadMyTable(
	v_last_dl_ts IN TIMESTAMP,
	v_user_name IN VARCHAR,
	v_ref_crsr OUT SYS_REFCURSOR ) As
Begin
    Open v_ref_crsr For
        select pk, col1, col2
            from MyTable
                where last_modified >= v_last_dl_ts
                and employee = v_user_name;
End DownloadMyTable;

接着,使用 ml_add_table_script 存储过程将对 DownloadMyTable 的调用定义为同步表 MyTable 的 download_cursor 脚本:

CALL ml_add_table_script( 
  'v1',
  'MyTable',
  'download_cursor',
  '{CALL DownloadMyTable( 
      {ml s.last_table_download},{ml s.username} )}'
);

对于 Oracle,请注意,DownloadMyTable 存储过程只用到两个参数(而非三个);MobiLink 服务器通过 REF CURSOR 读取结果集。REF CURSOR 定义为存储过程定义中的最后一个参数。

以下示例适用于 IBM DB2 LUW。



CREATE PROCEDURE DownloadMyTable(
   IN last_dl_ts TIMESTAMP,
   IN u_name VARCHAR( 128 ) )
        LANGUAGE SQL
        MODIFIES SQL DATA
        COMMIT ON RETURN NO
        DYNAMIC RESULT SETS 1

        BEGIN
            DECLARE C1, cursor WITH RETURN FOR
                SELECT pk, col1, col2 FROM MyTable
                WHERE last_modified >= last_dl_ts AND employee = u_name;
            OPEN C1;
        END;