MsqlPerl
Perl は最近では CGI プログラミング用の言語として広く利用されています。 Perl から mSQL にアクセスできれば、データベース連携 Web ページを、 柔軟に開発することが可能です。
Perl から mSQL データベースにアクセスするには、 一般的に MsqlPerl という Perl5 モジュールを使用します。 このモジュールは mSQL 配布キットに含まれていないので、 別途ダウンロードする必要があります。
ここでは Perl5 自体に関する解説はしません。
各自マニュアルなどで学習してください。 Perl5
ではオブジェクト指向が取り入れられ、 MsqlPerl
も「クラス」という形で提供されていますが、
使い方の手順さえわかれば、
オブジェクト指向がわからなくても、問題ないと思います。
アクセス手順
以下の手順でデータにアクセスします。 SELECT でデータを取り出す時は、この3ステップになります。
- データベースに接続 connect
- クエリー(SQL)発行 query
- SELECT なら、結果を取り出す(フェッチする) fetchrow, fetchhash
データベースへの接続とクエリー発行
では実際にデータベースにクエリーを発行してみましょう。 まずは、INSERT を発行してみます。 以下は実際のプログラム例です。行番号は説明のために便宜上付けています。
1: #!/usr/bin/perl 2: 3: use Msql; 4: 5: $dbh = Msql->connect('host', 'EMPLOYEE'); 6: $sth = $dbh->query("insert into EmpTbl (no, div, name) 7: values (101, 3, '宮前 竜也')");
1 行目 | Perl の基本的なおまじないなので説明省略。 |
3 行目 | MsqlPerl を使うぞ。という宣言です。必ず書きます。 |
5 行目 | ホスト名 host というマシンの EMPLOYEE データベースに接続します。 |
6 行目 | クエリー発行です。これで EmpTbl に INSERT されます。 |
もしオブジェクト思考について良くわからないのなら、 ここで使われている $dbh 変数はファイル操作で使う、 ファイルハンドルのようなものだと思えば良いでしょう。 connect() を呼ぶとハンドルが返りますので、 以後クエリーを発行するには、このハンドルを使います。 一度ハンドルを得れば、プログラム中で何度でもクエリーを発行できます。 さらに query() で返ってくるハンドルは、 SELECT を発行した際に、結果を取り出す時に使います。 それについては次節で解説します。
詳しくわからなくても、 これを真似て書けば、十分にデータベースにアクセスできます。 では、connect() と query() の構文をまとめてみましょう。
connect(ホスト名, データベース名);
query(SQL文);
フェッチ
次は SELECT してみましょう。 クエリーを発行したあと、結果を取り出す操作が必要になります。 プログラムの基本は、前節で示したものと同じで、 6 行目のクエリー発行部分を SELECT 文にするだけです。
1: #!/usr/bin/perl 2: 3: use Msql; 4: 5: $dbh = Msql->connect('host', 'EMPLOYEE'); 6: $sth = $dbh->query("select no, name from EmpTbl");
この後、「フェッチ(結果取り出し)」を行います。 フェッチするための関数(メソッド)は、 fetchrow と fetchhash の 2 種類あります。 これらは、結果を配列に格納するか、 カラム名をキーとした連想配列に格納するかの違いがあります。
どちらも結果を 1 レコードだけ取り出します。
結果が最後になるまで、ループしてこれらの関数を呼びます。
fetchrow
まずは fetchrow を使ってみましょう。これを呼ぶと、 結果が 1 レコード、配列上に取り出されます。
@row = $sth->fetchrow;
これにより結果は、以下のように配列に格納されます。
$row[0] .... 101 $row[1] .... 3 $row[2] .... '宮前 竜也'
以下は全レコードを取り出し、結果を表示するプログラム例です。
7: while (@row = $sth->fetchrow) { 8: foreach $data (@row) { 9: print "$data\n"; 10: } 11: }
fetchhash
次は fetchhash を使ってみましょう。これを呼ぶと、 結果が 1 レコード、カラム名をキーとした連想配列上に取り出されます。
%hash = $sth->fetchhash;
これにより結果は、以下のように連想配列に格納されます。
$hash{'no'} .... 101 $hash{'div'} .... 3 $hash{'name'} .... '宮前 竜也'
以下は全レコードを取り出し、結果を表示するプログラム例です。
7: while (%hash = $sth->fetchhash) { 8: foreach $key (keys hash) { 9: print "$key = $hash{$key}\n"; 10: } 11: }
その他のメソッド
numrows, numfields
それぞれ、結果のレコード数、フィールド数が得られます。
$numrows = $sth->numrows;
$numfields = $sth->numfields;
length
フィールドのサイズをバイト単位で得ます。 SELECT を発行した後、以下のようにすると、 最初のフィールドのサイズがわかります。
$length = $sth->length->[0];
name
カラム名を得ます。 SELECT を発行した後、以下のようにすると、 カラム名が配列に格納されます。
@list = $sth->name;