Mobile Link サーバーでデータスクリプトの呼び出し中に SQL エラーが発生したときに実行されます。
次の表の説明では、SQL データ型を示します。Java または .NET でスクリプトを作成する場合、適切な対応するデータ型を使用する必要があります。 SQL データ型と Java データ型とSQL データ型と .NET データ型を参照してください。
SQL スクリプトでは、名前または疑問符を使用してイベントパラメーターを指定できます。疑問符の使用は推奨されなくなりました。名前付きパラメーターを使用することをおすすめします。1 つのスクリプト内で名前と疑問符を混在させることはできません。疑問符を使用する場合、パラメーターは以下に示す順に指定する必要があり、後続のパラメーターが指定されていない場合のみ省略可能です (たとえば、パラメーター 2 を使用する場合は、パラメーター 1 を使用してください)。名前付きパラメーターを使用する場合は、パラメーターの任意のサブセットを任意の順に指定できます。
SQL スクリプトのパラメーター名 | 説明 | 順序 (SQL では非推奨) |
---|---|---|
s.action_code |
INTEGER。これは INOUT パラメーターです。この値は、Mobile Link サーバーにエラーへの対処方法を指示するために設定します。 |
1 |
s.error_code |
INTEGER。ネイティブの RDBMS エラーコード。 |
2 |
s.error_message |
TEXT。ネイティブの RDBMS エラーメッセージ。 |
3 |
s.remote_id | VARCHAR(128)。Mobile Link リモート ID。名前付きパラメーターを使用している場合のみ、リモート ID を参照できます。 | 適用不可 |
s.username |
VARCHAR(128)。Mobile Link ユーザー名。 |
4 |
s.table |
VARCHAR(128)。スクリプトにエラーがあるテーブル。スクリプトがテーブルスクリプトでない場合、テーブル名は NULL です。 |
5 |
Mobile Link サーバーは、デフォルトのアクションを選択します。スクリプト内でアクションを修正し、Mobile Link に次の処理を指示する値を返すことができます。action_code パラメーターには、次のいずれかの値を指定します。
1000 現在のローをスキップして、処理を続行します。
3000 現在のトランザクションをロールバックし、現在の同期をキャンセルします。これはデフォルトアクションコードで、handle_error スクリプトが定義されない場合、またはこのスクリプトが原因でエラーが発生した場合に使用されます。
4000 現在のトランザクションのロールバック、同期のキャンセル、Mobile Link サーバーの停止を行います。
Mobile Link サーバーは、現在のアクションコードで送信します。最初は 1 回の SQL 操作によって発生したエラーのセットごとに 3000 が設定されます。通常、エラー数は SQL 操作ごとに 1 つのみですが、複数の場合もあります。ローをバッチでアップロードする場合、この handle_error スクリプトは、バッチに含まれるエラーごとに 1 回呼び出されます。同じ同期中、最初のエラーに渡されるアクションコードは 3000 です。以降の呼び出しには、直前の呼び出しから返されたアクションコードが渡されます。Mobile Link は、複数の呼び出しから返される値のうち最も大きい番号が付いた値を使用します。
ローをバッチでアップロードする方法の詳細については、-s mlsrv12 オプションを参照してください。
スクリプト内でアクションコードを修正し、Mobile Link に次の処理を指示する値を返すことができます。Mobile Link サーバーが次に何を行うかは、アクションコードに示されます。Mobile Link サーバーは、エラーの重大度に応じてアクションコードにデフォルト値を設定してから、このスクリプトを呼び出します。この値は、スクリプトで変更できます。スクリプトは、必ずアクションコードを返すか設定するようにします。
エラーの内容は、error_code とメッセージで識別できます。
Mobile Link がアップロードトランザクション中に挿入、更新、または削除スクリプトを処理している間、またはダウンロードローをフェッチしている間に ODBC エラーが発生した場合、Mobile Link サーバーはこのスクリプトを実行します。別のときに ODBC エラーが発生した場合、Mobile Link サーバーは report_error または report_ODBC_error スクリプトを呼び出して、同期をアボートします。
特定のテーブルの操作中にエラーが発生した場合は、テーブル名が指定されます。それ以外の場合、この値は NULL です。テーブル名は、クライアントアプリケーションでのテーブル名です。この名前に直接対応するものが統合データベース内にあるかどうかは、リモートデータベースのテーブル名が統合データベースのテーブルにどのようにマッピングされているかによって異なります。
handle_error イベント用の SQL スクリプトは、ストアドプロシージャーとして実装してください。
次のいずれかの方法で、handle_error スクリプトから値を返すことができます。
次のように、プロシージャーの OUTPUT パラメーターに action_code パラメーターを渡す。
CALL my_handle_error( {ml s.action_code}, {ml s.error_code}, {ml s.error_message}, {ml s.username}, {ml s.table} ) |
次のように、プロシージャーまたはファクションの戻り値を介して action_code を設定する。
{ml s.action_code} = CALL my_handle_error( {ml s.error_code}, {ml s.error_message}, {ml s.username}, {ml s.table} ) |
ほとんどの RDBMS では、RETURN 文を使用してプロシージャーまたはプロシージャーからの戻り値を設定します。
CustDB サンプルアプリケーションには、さまざまなデータベース管理環境に対するエラーハンドラーが含まれています。
次の例は SQL Anywhere 統合データベースで動作します。これによって、アプリケーションは冗長挿入を無視できます。
次の Mobile Link システムプロシージャーコールは、ULHandleError ストアドプロシージャーを handle_error イベントに割り当てます。
CALL ml_add_connection_script( 'ver1', 'handle_error', 'CALL ULHandleError( {ml s.action_code}, {ml s.error_code}, {ml s.error_message}, {ml s.username}, {ml s.table} )' ) |
次の SQL 文は ULHandleError ストアドプロシージャーを作成します。
CREATE PROCEDURE ULHandleError( INOUT action integer, IN error_code integer, IN error_message varchar(1000), IN user_name varchar(128), IN table_name varchar(128) ) BEGIN -- -196 is SQLE_INDEX_NOT_UNIQUE -- -194 is SQLE_INVALID_FOREIGN_KEY IF error_code = -196 or error_code = -194 then -- ignore the error and keep going SET action = 1000; ELSE -- abort the synchronization SET action = 3000; END IF; END |
次の Mobile Link システムプロシージャーコールは、スクリプトバージョン ver1 を同期するときに、handleError という Java メソッドを handle_error 接続イベント用のスクリプトとして登録します。
CALL ml_add_java_connection_script( 'ver1', 'handle_error', 'ExamplePackage.ExampleClass.handleError' ) |
次に示すのは、サンプルの Java メソッド handleError です。このメソッドは、渡されたデータに基づいてエラーを処理します。また、エラーの結果生じるエラーコードも判別します。
package ExamplePackage; public class ExampleClass { public void handleError( ianywhere.ml.script.InOutInteger actionCode, int errorCode, String errorMessage, String user, String table ) { // -196 is SQLE_INDEX_NOT_UNIQUE // -194 is SQLE_INVALID_FOREIGN_KEY if( errorCode == -196 || errorCode == -194 ) { // ignore the error and keep going actionCode.setValue( 1000 ); } else { // abort the synchronization actionCode.setValue( 3000 ); } } } |
次の Mobile Link システムプロシージャーコールは、スクリプトバージョン ver1 を同期するときに、HandleError という .NET メソッドを handle_error 接続イベント用のスクリプトとして登録します。
CALL ml_add_dnet_connection_script( 'ver1', 'handle_error', 'TestScripts.Test.HandleError' ) |
次に示すのは、サンプルの .NET メソッド HandleError です。
namespace TestScripts { public class Test { public void HandleError( ref int actionCode, int errorCode, string errorMessage, string user, string table ) { // -196 is SQLE_INDEX_NOT_UNIQUE // -194 is SQLE_INVALID_FOREIGN_KEY if( errorCode == -196 || errorCode == -194 ) { // ignore the error and keep going actionCode = 1000; } else { // abort the synchronization actionCode = 3000; } } } } |
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |