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

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - プログラミング » SQL Anywhere データ・アクセス API » SQL Anywhere 外部関数 API

 

外部呼び出しを使ったプロシージャと関数の作成

ここでは、外部呼び出しを使ったプロシージャと関数の例を示します。

DBA 権限

外部ライブラリを参照するプロシージャまたは関数を作成するには、DBA 権限が必要です。その他のプロシージャまたは関数の作成には RESOURCE 権限が必要ですが、外部プロシージャまたは関数の作成には DBA 権限が必須です。

構文

次のように、ライブラリ (ダイナミック・リンク・ライブラリ (DLL) または共有オブジェクト) 内の C/C++ 関数を呼び出す SQL ストアド・プロシージャを作成できます。

CREATE PROCEDURE coverProc( parameter-list )
  EXTERNAL NAME 'myFunction@myLibrary'
  LANGUAGE C_ESQL32;

この方法でストアド・プロシージャまたは関数を定義するときは、外部 DLL の関数へのブリッジを作成することになります。ストアド・プロシージャまたは関数は、それ以外のタスクを実行できません。

同様に、ライブラリ内の C/C++ 関数を呼び出す SQL ストアド関数を次のように作成できます。

CREATE FUNCTION coverFunc( parameter-list )
  RETURNS data-type
  EXTERNAL NAME 'myFunction@myLibrary'
  LANGUAGE C_ESQL32;

これらの文では、EXTERNAL NAME 句は関数の名前とその関数があるライブラリを示します。この例では、myFunction がライブラリのエクスポートされる関数名で、myLibrary がライブラリの名前 (たとえば、myLibrary.dll または myLibrary.so) です。

LANGUAGE 句は、関数が外部環境で呼び出されることを示しています。LANGUAGE 句では、C_ESQL32、C_ESQL64、C_ODBC32、C_ODBC64 のいずれか 1 つを指定できます。32 または 64 のサフィックスは、関数が 32 ビットまたは 64 ビットのアプリケーションとしてコンパイルされていることを示しています。ODBC 指定は、アプリケーションが ODBC API を使用することを示しています。ESQL 指定は、アプリケーションが Embedded SQL API、SQL Anywhere C API、その他の非 ODBC API を使用するか、または API を一切使用しない場合があることを示しています。

LANGUAGE 句を省略すると、関数を含むライブラリはデータベース・サーバのアドレス領域にロードされます。外部関数は呼び出されるとサーバの一部として実行されます。この場合、関数が原因で障害が発生すると、データベース・サーバは終了されます。したがって、関数のロードおよび実行は外部環境で行うことを推奨します。関数が原因で外部環境に障害が発生した場合、データベース・サーバは実行し続けます。

parameter-list の引数の型と順序は、ライブラリ関数によって定義されている引数と対応しなければなりません。ライブラリ関数は、外部関数のプロトタイプで説明した API を使ってプロシージャ引数にアクセスします。

外部関数から返される値や結果セットは、ストアド・プロシージャまたは関数によって、呼び出し元の環境に返すことができます。

他の文は使用不可

外部関数を参照するストアド・プロシージャまたは関数に、その他の文を含めることはできません。このストアド・プロシージャまたは関数の目的は、関数の引数を取ること、関数を呼び出すこと、関数から返ってきた値と引数を呼び出し元の環境に返すことです。このプロシージャ呼び出しの IN、INOUT、OUT パラメータは、通常のプロシージャの場合と同じように使用できます。入力された値は外部関数に渡され、関数によって変更されたパラメータは OUT または INOUT パラメータを通して、またはストアド関数の RETURNS 結果として、呼び出し元の環境に返されます。

オペレーティング・システムに依存する呼び出し

あるオペレーティング・システムではある関数を呼び出し、もう 1 つのオペレーティング・システムでは (おそらく同じ機能の) 別の関数を呼び出せます。この場合の構文は、関数名にオペレーティング・システム名をプレフィクスとして付けます。オペレーティング・システムの識別子は UNIX にしてください。次に例を示します。

CREATE FUNCTION func ( parameter-list )
  RETURNS data-type
  EXTERNAL NAME 'Unix:function-name@library.so;function-name@library.dll';

関数のリストにサーバのオペレーティング・システムのエントリがなく、オペレーティング・システムが指定されていないエントリを含む場合、データベース・サーバはそのエントリのこの関数を呼び出します。

参照