ユーザー定義関数における、C言語関数のリンクと呼出し手順を、以下の図に示します。
連結処理において、C言語関数名:Defuncとした場合の例です。
図7.4 ユーザー定義関数の呼出し(コマンド利用時)
コマンドが起動された後に、指定されたライブラリをロードします。また、実行スレッド作成後に、指定されたすべてのユーザー定義関数に対して、対応するC言語関数を呼び出し種別「DE_USER_FUNCTION THREAD_OPEN」で呼び出します。
使用されているユーザー定義関数に対して、対応するC言語関数を呼び出し種別「DE_USER_FUNCTION_EXEC 」および呼び出し種別「DE_USER_FUNCTION_FREE」で呼び出します。
処理が終了した後、定義されたすべてのユーザー定義関数に対して、対応するC言語関数を呼び出し種別「DE_USER_FUNCTION_THREAD_CLOSE」で呼び出します。その後、ライブラリをアンロードします。
コマンド利用時の注意事項
呼び出し種別「DE_USER_FUNCTION THREAD_OPEN」で呼び出したときに返却されるハンドルは、ユーザー定義関数ごとに共有のものになります。
ユーザー定義関数は、参照透過性があるものとみなします。
ユーザー定義関数は、その結果が処理に必要になると判断された場合にだけ呼び出されます。以下のような場合は、呼び出されないことがあります。
連結機能で呼び出されたが、結合型に「INNER」が指定されて1つのレコードも連結されなかった場合
仮想項目機能のIF式で呼び出されたが、条件が正にならなかった場合
ユーザー定義関数は、「DE_USER_FUNCTION_EXEC」と「DE_USER_FUNCTION_FREE」で完結した処理を実施してください。
例:終了処理で、「DE_USER_FUNCTION_EXEC」で実行した回数を取得することはしない。
動作環境ファイルにParallelNumパラメタが指定された場合には、実行スレッドが複数存在します。複数スレッドにまたがってユーザー定義関数が実行される可能がありますが、ユーザー定義関数間での情報の共有や更新は実施しないでください。
例:連番を設定するようなユーザー定義関数は、連番情報を複数の実行スレッドで発行されるユーザー定義関数で更新する必要があります。このようなユーザー定義関数は、Data Effectorでは利用できません。