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

SQL Anywhere 11.0.1 (Deutsch) » MobiLink - Serveradministration » MobiLink-Servertechnologie verwenden » Synchronisationsmethoden

 

Download einer Ergebnismenge aus Aufruf einer gespeicherten Prozedur

Sie können den Download einer Ergebnismenge aus einem Aufruf einer gespeicherten Prozedur durchführen. Beispiel: Sie benutzen ein download_cursor-Skript für folgende Tabelle:

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

Das Tabellenskript download_cursor kann z.B. wie folgt aussehen:

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

Wenn Sie Downloads in Tabelle MyTable durchführen wollen, um eine komplexere Unternehmenslogik einzusetzen, können Sie nun Ihr Skript wie folgt erstellen, wobei DownloadMyTable eine gespeicherte Prozedur ist, die zwei Parameter übernimmt (Zeitstempel des letzten Downloads und MobiLink-Benutzername) und eine Ergebnismenge zurückgibt. (Dieses Beispiel verwendet aus Gründen der Portierbarkeit eine ODBC-Aufrufkonvention):

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

Im Folgenden finden Sie einige Beispiele für die verschiedenen unterstützten konsolidierten Datenbanken. Einzelheiten hierzu können Sie der Dokumentation Ihrer konsolidierten Datenbank entnehmen.

Das folgende Beispiel ist für SQL Anywhere-, Adaptive Server Enterprise- und Microsoft SQL Server geeignet.

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

Folgendes Beispiel ist für Oracle geeignet. Oracle erfordert die Definition eines Pakets. Dieses Paket muss einen Datensatztyp für die Ergebnismenge enthalten und einen Cursortyp, der den Datensatztyp zurückgibt.

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;

Außerdem benötigt Oracle eine gespeicherte Prozedur mit dem Cursortyp als erstem Parameter. Beachten Sie, dass das download_cursor-Skript nur zwei Parameter übergibt, nicht drei. Bei gespeicherten Prozeduren, die in Oracle Ergebnismengen übergeben, legen die Cursortypen, die in der gespeicherten Prozedur als Parameter definiert sind, die Struktur der Ergebnismenge fest und stellen keine echten Parameter dar. In diesem Beispiel fügt die gespeicherte Prozedur das Skript auch der MobiLink-Systemtabelle hinzu.

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} )}'
);

Folgendes Beispiel ist für IBM DB2 LUW geeignet.

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;

Folgendes Beispiel ist für IBM DB2 Mainframe geeignet.

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;