Adaptive Server Anywhere (SQL Anywhere) Perl-DBI インタフェース

Perl

Perl は任意のテキスト・ファイルをスキャンし、それらのテキスト・ファイルから情報を抽出し、その情報に基づいてレポートを出力するために最適化された言語です。DBI は、Perl のデータベース・インタフェース・モジュールです。この DBI では、実際に使用されるデータベースから独立した整合性のあるデータベースを提供する一連のメソッド、変数、および規則が定義されます。

DBI

DBI の設計開発者である Tim Bunce 氏は次のように述べています。

「DBI は、Perl 言語用のデータベース・アクセス API (Application Programming Interface) です。DBI API仕様では、実際に使用されるデータベースから独立した整合性のあるデータベースを提供する一連の関数、変数、および規則が定義されます。」

重要なのは、DBI が単なるインタフェース、つまりアプリケーションと 1 つ以上のデータベース・ドライバ・モジュールの間を接続する層であるということです。このモジュールは、実際の作業を実行するドライバ・モジュールです。DBI は、ドライバが内部で機能するための標準のインタフェースとフレームワークを提供します。

DBI アプリケーションのアーキテクチャ

API は、Application Perl-script (または Programming) Interface の略です。これは、コール・インタフェースと、DBI によって Perl スクリプトに提供される変数で構成されます。この API は、DBI Perl 拡張によって実装されます。

DBD::ASAny — Perl5 用の Adaptive Server Anywhere (SQL Anywhere) インタフェース

Portions Copyright (c) 1994,1995,1996 Tim Bunce
Portions Copyright (c) 1996,1998,1999,2000 Sybase Inc.

ライセンス情報については、このディストリビューションに付属している license.txt を参照してください。

このインタフェースの構築、テスト、およびインストールを実行する前に、次のことを行う必要があります。

Perl 5 (5.002beta2 以降) の構築、テスト、およびインストールを行います。
Perl 5 をテストしてインストールすることは非常に重要です。
DBI モジュール (DBI 1.13 以降)の構築、テスト、およびインストールを行います。
DBI モジュールをテストしてインストールすることは非常に重要です。
DBI README ファイルを必ず読んでください。

構築 :
UNIX の場合:
[ Solaris、AIX、HP-UX、Linux ]
perl Makefile.PL
make
make test
make install

Win32 の場合:
[ Microsoft C と ActiveState の ActivePerl (www.activestate.com) が必要 ]perl Makefile.PL
nmake
nmake test
nmake install

回帰テストはさしあたり必要な最小限のものなので、このテストが正常に終了しても、すべて正常に機能しているとは限りません。

生成された Makefile の内容は、その意味を完全に理解していないかぎり手動で編集しないでください。
常に Makefile.PL コマンド・ラインを使用して変更を行うか、Makefile.PL を編集するようにしてください。

注:

1. テクニカル・サポートでは、Adaptive Server Anywhere (SQL Anywhere) DBD ドライバをサポートしていません。問題が発生した場合は、自分で解決を試みてから連絡してください。追加、改良、またはバグ修正を行った場合は、次期バージョンに反映できるようにその変更内容を開発者に通知してください。

2. Adaptive Server Anywhere (SQL Anywhere) の connect() メソッドは、パスワードと dbname のフィールドを無視します。完全な接続文字列は、uid フィールドによって供給されます。次にその例を示します。
$dbh = DBI->connect( ”, ‘UID=dba;PWD=sql;ENG=asademo’, ”, ‘ASAny’ );

3. ‘make test’ を実行する前に、ASA ディレクトリに配置された sademo.db ファイルのコピーが、ユーザのカレント・ディレクトリに含まれている必要があります。UNIX では、エンジンの自動開始と自動停止をすばやく連続して実行すると問題が発生することがありました。エンジンの自動開始時に問題が発生した場合は、asademo.db でエンジンを起動してからテストを実行してください。

4. ASAny DBD ドライバは、スレッドセーフになっています。ただし、単純なマルチスレッド・テストでは、Perl が簡単にクラッシュする場合があります。この不安定な状態は、ドライバではなく、スレッド環境における Perl スレッドや DBI の現在の実装が原因であると思われます。

では、何が実装されているのでしょうか?

DBI.pm の下部にある次のリストを調べてください。

$dbh = DBI->connect($data_source, $username, $auth);
$dbh = DBI->connect($data_source, $username, $auth, \%attr);
$rc = $dbh->disconnect;
$rv = $dbh->do($statement);
$rv = $dbh->do($statement, \%attr); %attr is ignored
$rv = $dbh->do($statement, \%attr, @bind_values);        %attr is ignored
$sth = $dbh->prepare($statement);
$sth = $dbh->prepare($statement, \%attr);             %attr is ignored
$rc = $sth->bind_col($col_num, \$col_variable);
$rc = $sth->bind_columns(\%attr, @list_of_refs_to_vars_to_bind);
$rv = $sth->bind_param($param_num, $bind_value);
$rv = $sth->bind_param($param_num, $bind_value, $bind_type);
$rv = $sth->bind_param($param_num, $bind_value, \%attr);
$rv = $sth->execute;
$rv = $sth->execute(@bind_values);
@row_ary = $sth->fetchrow_array;
$ary_ref = $sth->fetchrow_arrayref;
$hash_ref = $sth->fetchrow_hashref;
$rc = $sth->finish;
$rv = $sth->rows;
$rc = $dbh->commit;
$rc = $dbh->rollback;
$sql = $dbh->quote($string);
$rc = $h->err;
$str = $h->errstr;
$rv = $h->state;                      Not supported

$sth->{NAME} (\@)                  Yes
$sth->{NULLABLE} (\@)               No
$sth->{TYPE} (\@)                   No

$sth->{PRECISION} (\@)               No
$sth->{SCALE} (\@)                  No
$sth->{NUM_OF_FIELDS} ($)             Yes
$sth->{NUM_OF_PARAMS} ($)            Yes
—————————————————————

‘eg’ ディレクトリには、2 つの例があります。
connect.pl -> 単純な接続を実行します。
retrieve.pl -> テーブルからデータを抽出して、結果セットを表示します。
その他の例については、’t’ ディレクトリにあるテスト・スクリプトを参照してください。

select.pl

接続を行い、Adaptive Server Anywhere (SQL Anywhere) に対して簡単な選択を実行するサンプル・プログラムを見ていきます。まず、必要なパラメータを DBI -> connect メソッドに渡してデータベースに接続します。次に、実行する SQL 文を準備します。必要に応じてコード内で操作可能なディスクリート変数へのフェッチに対し、返されたデータの生出力を例示するため、このプログラムには 2 つの独立したフェッチ・ループが含まれています。ここでは、書式設定を少し追加してそれらのデータを出力しています。文ハンドルを解放し、データベースから切断することによって、アプリケーションが使用しているリソースを解放します。この解放処理は必ず行うようにしてください。

#!/usr/bin/perl -w
#
# select.pl: Connects to the sample database ‘asademo’
#       then SELECTs some basic data
#       out in array and scalar forms
use DBI;
my $database = “asademo”;
my $data_source = “DBI:ASAny:$database”;
my $username = “UID=dba;PWD=sql;ENG=asademo”;
my $dbh = DBI->connect( $data_source, $username, ‘na’ );
# Prepare the statement for execution
$sth =
  $dbh->prepare( “
     SELECT dept_id, dept_name
     FROM department
   ” );
if ( !defined $sth )
   die “Cannot prepare statement: $DBI::errstr\n”;
}
# Execute the statement at the database level
$sth->execute;
# Fetch the rows back from the SELECT statement
while ( @row = $sth->fetchrow() )
   print “Row returned: @row\n”;
}
# Re-execute the statement to bring the rows back again
$sth->execute;
# Fetch the data back into separate variables this time
while ( ( $dept_id, $dept_name ) = $sth->fetchrow() )
   print “Department ID: $dept_id\tDepartment Name: $dept_name\n”;
}
# Release the statement handle resources
$sth->finish;
# Disconnect from the database
$dbh->disconnect;
exit;

サンプルを実行するには、プロンプトで次のように入力します。
perl select.pl

予想される出力は次のとおりです。
Row returned: 100 R & D
Row returned: 200 Sales
Row returned: 300 Finance
Row returned: 400 Marketing
Row returned: 500 Shipping
Department ID: 100 Department Name: R & D
Department ID: 200 Department Name: Sales
Department ID: 300 Department Name: Finance
Department ID: 400 Department Name: Marketing
Department ID: 500 Department Name: Shipping

execute.pl

次に、実際にデータベースに変更を加えるサンプルを見ていきます。このコードは、サンプル・データベースに接続してから、更新文を実行します。これはカーソルを使用しないコードであるため、do()を使用しています。このコードの場合も、必要なパラメータを DBI -> connect メソッドに渡して、データベースに接続します。最後に、文ハンドルの解放とデータベースからの切断によって、アプリケーションが使用しているリソースを解放します。

#!/usr/bin/perl -w
#
# execute.pl: Connects to the sample database ‘asademo’
#       then EXECUTEs an update statement.
#       This is non-cursorial, so do() is used.
use DBI;
my $database = “asademo”;
my $data_source = “DBI:ASAny:$database”;
my $username = “UID=dba;PWD=sql;ENG=asademo”;
my $dbh = DBI->connect( $data_source, $username, ‘na’ );

# Prepare the statement for immediate execution
$rv =
   $dbh->do( “
     UPDATE test
     SET name = ‘Rick’
     WHERE id = 1
    ” );
  $dbh->do( “commit” );
if ( !defined $rv )
  die “Statement execution failed: $DBI::errstr\n”;
}
# Disconnect from the database
$dbh->disconnect;
exit;
サンプルを実行するには、プロンプトで次のように入力します。
perl execute.pl

dbisql または他のツールでデータベースを問い合わせると、操作が実際に実行されたかどうかを確認
できます。