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 外部環境のサポート

 

PERL 外部環境

SQL Anywhere では、Perl ストアド・プロシージャおよび関数をサポートしています。Perl ストアド・プロシージャまたは関数の動作は、SQL ストアド・プロシージャまたは関数と同じです。ただし、プロシージャまたは関数のコードは Perl で記述され、その実行はデータベース・サーバの外側 (つまり Perl 実行インスタンス内) で行われます。Perl 実行ファイルのインスタンスは、Perl ストアド・プロシージャおよび関数を使用する接続ごとに存在します。この動作は、Java ストアド・プロシージャおよび関数と異なります。Java の場合、接続ごとに 1 つのインスタンスではなく、各データベースの Java VM に 1 つのインスタンスがあります。Perl と Java のもう 1 つの大きな相違点は、Perl ストアド・プロシージャは結果セットを返さないのに対し、Java ストアド・プロシージャは結果セットを返すことができる点です。

データベースでの Perl のサポートを使用するためには、いくつかの前提条件があります。

  1. Perl をデータベース・サーバ・コンピュータにインストールする必要があります。また、SQL Anywhere データベース・サーバで Perl 実行ファイルを検出できることが必要です。

  2. DBD::SQLAnywhere ドライバをデータベース・サーバ・コンピュータにインストールする必要があります。

  3. Windows の場合、Microsoft Visual Studio もインストールされていることが必要です。これが前提条件であるのは、DBD::SQLAnywhere ドライバをインストールするために必要だからです。

DBD::SQLAnywhere ドライバのインストールの詳細については、SQL Anywhere Perl DBD::SQLAnywhere DBI モジュールを参照してください。

上記の前提条件に加え、データベース管理者は SQL Anywhere Perl 外部環境モジュールをインストールする必要もあります。外部環境モジュールをインストールする手順を次に示します。

♦  外部環境モジュールをインストールするには、次の手順に従います (Windows の場合)。
♦  外部環境モジュールをインストールするには、次の手順に従います (UNIX の場合)。

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 サポートの使用に関する詳細および例については、samples-dir\SQLAnywhere\ExternalEnvironments\Perl ディレクトリのサンプルを参照してください。