SQL Anywhere では、Perl ストアドプロシージャーおよび関数をサポートしています。Perl ストアドプロシージャーまたはファンクションの動作は、SQL ストアドプロシージャーまたはファンクションと同じです。ただし、プロシージャーまたはファンクションのコードは Perl で記述され、その実行はデータベースサーバーの外側 (つまり Perl 実行インスタンス内) で行われます。Perl 実行ファイルのインスタンスは、Perl ストアドプロシージャーおよび関数を使用する接続ごとに存在します。この動作は、Java ストアドプロシージャーおよび関数と異なります。Java の場合、接続ごとに 1 つのインスタンスではなく、各データベースの Java VM に 1 つのインスタンスがあります。Perl と Java のもう 1 つの大きな相違点は、Perl ストアドプロシージャーは結果セットを返さないのに対し、Java ストアドプロシージャーは結果セットを返すことができる点です。
データベースでの Perl のサポートを使用するためには、いくつかの前提条件があります。
Perl をデータベースサーバーコンピューターにインストールする必要があります。また、SQL Anywhere データベースサーバーで Perl 実行ファイルを検出できることが必要です。
DBD::SQLAnywhere ドライバーをデータベースサーバーコンピューターにインストールする必要があります。
Windows の場合、Microsoft Visual Studio もインストールされていることが必要です。これが前提条件であるのは、DBD::SQLAnywhere ドライバーをインストールするために必要だからです。
DBD::SQLAnywhere ドライバーのインストールの詳細については、Perl DBI サポートを参照してください。
上記の前提条件に加え、データベース管理者は SQL Anywhere Perl 外部環境モジュールをインストールする必要もあります。外部環境モジュールをインストールする手順を次に示します。
次のコマンドを、SQL Anywhere インストール環境の SDK\PerlEnv サブフォルダーから実行します。
perl Makefile.PL nmake nmake install |
次のコマンドを、SQL Anywhere インストール環境の sdk/perlenv サブフォルダーから実行します。
perl Makefile.PL make make install |
Perl 外部環境モジュールが構築されてインストールされると、データベースでの Perl のサポートを使用できるようになります。データベースでの Perl のサポートを使用できるのは、SQL Anywhere バージョン 11 以降のデータベースのみです。SQL Anywhere 10 データベースがロードされている場合、データベースでの Perl のサポートを使用しようとすると、外部環境がサポートされていないことを示すエラーが返されます。
Perl をデータベースで使用するには、データベースサーバーが Perl 実行ファイルを検出して開始できることを確認してください。これは、次の文を実行して確認できます。
START EXTERNAL ENVIRONMENT PERL; |
データベースサーバーが Perl を開始できない場合は、データベースサーバーが Perl 実行ファイルを検出できないことが問題の原因であると考えられます。この場合は、ALTER EXTERNAL ENVIRONMENT 文を実行して、Perl 実行ファイルのロケーションを明示的に設定してください。実行ファイル名を必ず含めてください。
ALTER EXTERNAL ENVIRONMENT PERL LOCATION 'perl-path'; |
次に例を示します。
ALTER EXTERNAL ENVIRONMENT PERL LOCATION 'c:\\Perl\\bin\\perl.exe'; |
START EXTERNAL ENVIRONMENT PERL 文は、データベースサーバーが Perl を開始できるかどうかを確認する以外で使用することはありません。通常、Perl ストアドプロシージャーまたはファンクションを呼び出すと、Perl は自動的に開始されます。
これと同様に、Perl のインスタンスを停止するために STOP EXTERNAL ENVIRONMENT PERL 文を使用する必要もありません。インスタンスは、接続が切断されると自動的に停止します。ただし、Perl をこれ以上使用することがなく、一部のリソースを解放する必要がある場合は、STOP EXTERNAL ENVIRONMENT PERL 文を使用して接続のための Perl インスタンスを解放します。
データベースサーバーが Perl 実行ファイルを開始できることを確認したら、次に必要な Perl コードをデータベースにインストールします。これは、INSTALL 文を使用して行います。たとえば、次の文を実行して Perl スクリプトをファイルからデータベースにインストールできます。
INSTALL EXTERNAL OBJECT 'perl-script' NEW FROM FILE 'perl-file' ENVIRONMENT PERL; |
Perl コードは、次のようにして式から構築してインストールすることもできます。
INSTALL EXTERNAL OBJECT 'perl-script' NEW FROM VALUE 'perl-statements' ENVIRONMENT PERL; |
Perl コードは、次のようにして変数から構築してインストールすることもできます。
CREATE VARIABLE PerlVariable LONG VARCHAR; SET PerlVariable = 'perl-statements'; INSTALL EXTERNAL OBJECT 'perl-script' NEW FROM VALUE PerlVariable ENVIRONMENT PERL; |
Perl コードをデータベースから削除するには、次のように REMOVE 文を使用します。
REMOVE EXTERNAL OBJECT 'perl-script' |
既存の Perl コードを変更するには、次のように INSTALL EXTERNAL OBJECT 文の UPDATE 句を使用します。
INSTALL EXTERNAL OBJECT 'perl-script' UPDATE FROM FILE 'perl-file' ENVIRONMENT PERL |
INSTALL EXTERNAL OBJECT 'perl-script' UPDATE FROM VALUE 'perl-statements' ENVIRONMENT PERL |
SET PerlVariable = 'perl-statements'; INSTALL EXTERNAL OBJECT 'perl-script' UPDATE FROM VALUE PerlVariable ENVIRONMENT PERL |
Perl コードがデータベースにインストールされたら、必要な Perl ストアドプロシージャーおよび関数を作成できます。Perl ストアドプロシージャーおよび関数を作成するときは、LANGUAGE に必ず PERL を指定します。また、EXTERNAL NAME 文字列には、Perl サブルーチンを呼び出し、OUT パラメーターを返して、値を返すために必要な情報が含まれています。次のグローバル変数は、各呼び出し時に Perl コードで使用できます。
$sa_perl_return これは、関数呼び出しの戻り値を設定するために使用します。
$sa_perl_argN
N は正の整数 [0 .. n] です。これは、SQL 引数を Perl コードに渡すために使用します。たとえば、$sa_perl_arg0
は引数 0、$sa_perl_arg1
は引数 1 を示し、以降の引数も同様です。
$sa_perl_default_connection これは、サーバー側の Perl 呼び出しを作成するために使用します。
$sa_output_handle これは、Perl コードの出力をデータベースサーバーメッセージウィンドウに送信するために使用します。
Perl ストアドプロシージャーは、入出力の引数および戻り値にあらゆるデータ型セットを指定して作成できます。非バイナリのデータ型はすべて Perl 呼び出しの作成時に文字列にマッピングされますが、バイナリデータは数値の配列にマッピングされます。簡単な Perl の例を次に示します。
INSTALL EXTERNAL OBJECT 'SimplePerlExample' NEW FROM VALUE 'sub SimplePerlSub{ return( ($_[0] * 1000) + ($_[1] * 100) + ($_[2] * 10) + $_[3] ); }' ENVIRONMENT PERL; CREATE FUNCTION SimplePerlDemo( IN thousands INT, IN hundreds INT, IN tens INT, IN ones INT) RETURNS INT EXTERNAL NAME '<file=SimplePerlExample> $sa_perl_return = SimplePerlSub( $sa_perl_arg0, $sa_perl_arg1, $sa_perl_arg2, $sa_perl_arg3)' LANGUAGE PERL; // The number 1234 should appear SELECT SimplePerlDemo(1,2,3,4); |
次に示す Perl の例は、文字列を受け取り、それをデータベースサーバーメッセージウィンドウに書き込みます。
INSTALL EXTERNAL OBJECT 'PerlConsoleExample' NEW FROM VALUE 'sub WriteToServerConsole { print $sa_output_handle $_[0]; }' ENVIRONMENT PERL; CREATE PROCEDURE PerlWriteToConsole( IN str LONG VARCHAR) EXTERNAL NAME '<file=PerlConsoleExample> WriteToServerConsole( $sa_perl_arg0 )' LANGUAGE PERL; // 'Hello world' should appear in the database server messages window CALL PerlWriteToConsole( 'Hello world' ); |
サーバー側の Perl を使用するには、Perl コードに $sa_perl_default_connection 変数を使用する必要があります。次の例では、テーブルを作成してから Perl ストアドプロシージャーを呼び出して、テーブルにデータを移植します。
CREATE TABLE perlTab(c1 int, c2 char(128)); INSTALL EXTERNAL OBJECT 'ServerSidePerlExample' NEW FROM VALUE 'sub ServerSidePerlSub { $sa_perl_default_connection->do( "INSERT INTO perlTab SELECT table_id, table_name FROM SYS.SYSTAB" ); $sa_perl_default_connection->do( "COMMIT" ); }' ENVIRONMENT PERL; CREATE PROCEDURE PerlPopulateTable() EXTERNAL NAME '<file=ServerSidePerlExample> ServerSidePerlSub()' LANGUAGE PERL; CALL PerlPopulateTable(); // The following should return 2 identical rows SELECT count(*) FROM perlTab UNION ALL SELECT count(*) FROM SYS.SYSTAB; |
データベースでの Perl サポートの使用に関する詳細および例については、%SQLANYSAMP12%\SQLAnywhere\ExternalEnvironments\Perl ディレクトリのサンプルを参照してください。
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |