SQL-SELECT文からPerl-HASH関数へ(Select2Hash)
PerlからOLEモジュールを使って、SQLServerからデータをSELECTするときに、そのデータを、行は配列、列はハッシュとして、Perlでの「ハッシュの配列」に格納すると取得データのアクセスが便利です。
以下のSelect2Hash関数は、そのような関数です。
use strict; my @result = &Select2Hash("SELECT UserName, UserTel FROM UserTable"); for (my $i = 0; $i <= $#result; $i++){ print $result[$i]{UserName}, "\n"; print $result[$i]{UserTel}, "\n"; } sub Select2Hash { # 本ルーチンによるSELECT文フォーマット制限 # 1,SELECTとFROMを必ず同一行に記述する。(SELECT aaa, bbb, ccc FROM……) # 2,選択項目でエイリアスがある時は必ずASキーワードを使用する(SELECT X.aaa AS xxx, ……) # 3,選択項目は、アスター「*」は不可(選択項目はハッシュキーになるため)。 use Win32::OLE; use Win32::OLE::Variant; # これがないと日付型系データが上手く取得できない use Win32::OLE::Const 'Microsoft ActiveX Data Objects 2.0 Library';# adUseClient等が宣言されている Win32::OLE->Option(Warn => 3); # エラー時にエラーメッセージを出力後、本プロセスが終了する # 以下の接続情報を初期コーディングする。 my $server=''; # DBServer my $db=''; # DBName my $id=''; # ID my $ps=''; # Password my ($Sql) = @_; # 引数取得(SQL文のみ) # DB接続 my $objDB=Win32::OLE->new("ADODB.Connection"); my $connStr="Provider=sqloledb;". "Data Source=$server;". "Initial Catalog=$db;". "User ID=$id;". "Password=$ps;"; #(WINDOWS認証の時は『Integrated Security=SSPI;』を付加する) $objDB->Open($connStr); if ($objDB->{Errors}->{Count}) { die "cannot connect '$connStr'"; } # Recordsetを作成 my $rs=Win32::OLE->new("ADODB.Recordset"); # RecordCountを返すようにする $rs->{CursorLocation} = adUseClient; # SQL文からハッシュキーにするための選択項目を配列に取得する。 $Sql =~ /SELECT(.*?)FROM/i; # ?の最小マッチにするのは、Where文にFROMが入る可能性があるため my $wk = $1; 1 while $wk =~ s/\([^()]*\)//g; # 関数系を弾く $wk = ',' . $wk; # 先頭に「,」を付加する $wk =~ s/,[^,]*? AS/,/gi; # AS系を弾く $wk =~ s/^,//; # 先頭の「,」を削除する $wk =~ s/ //g; # スペースをつめる my @selectItem = split(/,/, $wk); # SELECTしたデータを、行は配列へ列は選択項目がキーのハッシュへ格納する。 my %data; my @AoA; my $ref; $rs->Open($Sql, $objDB); while(!$rs->EOF and $rs->{RecordCount}!=0){ foreach my $scalar (@selectItem) { $data{$scalar} = $rs->{Fields}->{$scalar}->{Value}; } $rs->MoveNext(); $ref = { %data }; push @AoA, $ref; } $rs->Close(); # DB切断 $objDB->Close(); return @AoA; }
留意点:本ルーチンによるSELECT文フォーマット制限
- SELECTとFROMを必ず同一行に記述する。(SELECT aaa, bbb, ccc FROM……)
- 選択項目でエイリアスがある時は必ずASキーワードを使用する(SELECT X.aaa AS xxx, ……)
- 選択項目は、アスター「*」は不可(選択項目はハッシュキーになるため)。