ダウンロードして、リモートデータベースの特定のテーブルで挿入または更新するローを選択するためのカーソルを定義するデータスクリプトです。
SQL スクリプトでは、名前または疑問符を使用してイベントパラメータを指定できます。疑問符の使用は推奨されなくなりました。名前付きパラメータを使用することをおすすめします。1 つのスクリプト内で名前と疑問符を混在させることはできません。疑問符を使用する場合、パラメータは以下に示す順に指定する必要があり、後続のパラメータが指定されていない場合のみ省略可能です (たとえば、パラメータ 2 を使用する場合は、パラメータ 1 を使用してください)。名前付きパラメータを使用する場合は、パラメータの任意のサブセットを任意の順に指定できます。
SQL スクリプトのパラメータ名 | 説明 | 順序 (SQL では非推奨) |
---|---|---|
s.last_table_download |
TIMESTAMP。テーブルの最後のダウンロード時刻。 |
1 |
s.remote_id | VARCHAR(128)。Mobile Link リモート ID。名前付きパラメータを使用している場合のみ、リモート ID を参照できます。 | 適用外 |
s.username |
VARCHAR(128)。Mobile Link ユーザ名。 |
2 |
s.script_version | VARCHAR(128)。Mobile Link サーバが現在の同期に使用しているスクリプトバージョン文字列をこのパラメータに渡すことを指定する、オプションの IN パラメータ。このパラメータの指定に疑問符を使用することはできません。 | 適用外 |
なし。
Mobile Link サーバはスクリプトを使用して読み込み専用のカーソルを開き、リモートデータベースにダウンロードするローのリストをフェッチします。
リモートデータベースのテーブルごとに、download_cursor スクリプトを 1 つ指定できます。
Ultra Light クライアントに対する同期のダウンロード処理のパフォーマンスを最適化するには、プライマリキー値の範囲がデバイスで指定されている現在のローの外側にある場合に、ダウンロードカーソル内のローをプライマリキー順に並べてください。たとえば、大きいリファレンステーブルをダウンロードする場合は、このような最適化による利点が得られます。
各 download_cursor スクリプトには、SELECT 文か、結果セットを返すプロシージャの呼び出しが必要です。Mobile Link サーバは、SELECT 文を使用して統合データベース内でカーソルを定義します。
スクリプトでは、対応するリモートデータベース内のテーブルのカラムに対応するすべてのカラムを選択します。統合データベース内のカラムは、対応するリモートデータベースのカラムとは異なる名前にできますが、互換性のある型にしてください。
カラムは、対応するカラムがリモートデータベース内で定義されている順序に従って選択します。
不必要なローがダウンロードされることを防ぐために、タイムスタンプベースのダウンロードを使用することを検討してください。タイムスタンプベースのダウンロードを使用する場合は、download_cursor スクリプトの WHERE 句に次のような行を追加してください。
AND last_modified >= {ml s.last_table_download} |
このスクリプトは SQL で実装してください。 Java または .NET のローの処理については、ダイレクトローハンドリングを参照してください。
ダウンロードパフォーマンスに影響を与える大量の更新を行っているので、download_cursor スクリプトで READPAST テーブルヒントの使用を検討している場合は、代わりにダウンロードのスナップショットアイソレーションの使用を検討してください。READPAST テーブルヒントは、download_cursor スクリプトで使用すると問題を引き起こす可能性があります。タイムスタンプベースのダウンロードを使用している場合は、READPAST ヒントによってローが失われ、1 つのローが一度もリモートデータベースにダウンロードされなくなる可能性があります。次に例を示します。
1 つのローが統合データベースに追加され、コミットされます。そのローの last_modified カラムは、昨日の日時になっています。
同じローが更新されますが、コミットはされません。
last_download の値が先週の日時になっているリモートデータベースと同期されます。
download_cursor スクリプトは READPAST を使用してローを選択しようとして、そのローをスキップします。
ローを更新したトランザクションはロールバックされます。リモートに対する次の最終ロード時間は今日に進められます。
この時点から、このローは更新されないかぎりダウンロードされません。回避方法として、generate_next_last_download_timestamp または modify_next_last_download_timestamp スクリプトを実装して、最終ダウンロード時刻を最初に開いたトランザクションの開始時間に設定する方法が考えられます。
次の例は Oracle インストール環境の場合を示していますが、文はサポートされているすべてのデータベースに対して有効です。この例は、前回データをダウンロードした後に変更されたローのうち、emp_name カラム内のユーザ名と一致するローをすべてダウンロードします。
CALL ml_add_table_script( 'Lab', 'ULOrder', 'download_cursor', 'SELECT order_id, cust_id, prod_id, emp_id, disc, quant, notes, status FROM ULOrder WHERE last_modified >= {ml s.last_table_download} AND emp_name = {ml s.username}' ) |
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2013, SAP AG or an SAP affiliate company. - SAP Sybase SQL Anywhere 16.0 |