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

SQL Anywhere 11.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
)

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 SPDownload
    @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。Oracle 要求定义一个包。此包必须包含结果集的记录类型和一个返回此记录类型的游标类型。

Create or replace package SPInfo as
Type SPRec is record (
    pk     integer,
    col1   varchar(100),
    col2   varchar(20)
);
Type SPCursor is ref cursor return SPRec;
End SPInfo;

接下来,Oracle 需要一个以该游标类型作为第一个参数的存储过程。注意 download_cursor 脚本只传入两个参数,而不是三个。对于 Oracle 中返回结果集的存储过程,在存储过程定义中声明为参数的游标类型定义结果集的结构,但不这样定义真正的参数。本示例中,存储过程同样将该脚本添加到 MobiLink 系统表中。

Create or replace procedure
    DownloadMyTable( v_spcursor IN OUT SPInfo.SPCursor,
                     v_last_dl_ts IN DATE,
                     v_user_name IN VARCHAR ) As
Begin
    Open v_spcursor For
       select pk, col1, col2
         from MyTable
           where last_modified >= v_last_dl_ts
           and employee = v_user_name;
End;

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

以下示例适用于 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;

以下示例适用于 IBM DB2 主机。

CREATE PROCEDURE DownloadMyTable(
   IN last_dl_ts TIMESTAMP,
   IN u_name VARCHAR( 128 ) )
        LANGUAGE SQL
        MODIFIES SQL DATA
        EXTERNAL NAME MYDMT
        WLM ENVIRONMENT MYWLM
        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;