SQL-SELECT文からPerl-HASH関数へ(Select2Hash)

Perl初心者のためのPerlノートです!

HTML/ CSS/ CGI-Perl/ JavaScript/ JavaApplet/ AccessUp/ Internet/ EnglishLearn/ ちゃいちゃん天使/ 天使メッセージ/ 飯田ワールド/ 結城ワールド/ プロフィール/ WEB相談室/ WEBアンテナ/ WEBリーダー/ 燈明日記/ yahoo

◆ はじめに

本ページは、私がPerlを習得した時(いや習得中)のノートです。

ごく普通の言語(COBOL,C,Java,VB等)を知っている人が、Perlをやり始めるといろいろと悩むことがあります。

それは、

です。

本ページは、そのようなハードルを一つ一つクリアにしていけたらと思います。

そして、本ページが何かのお役に立てれば幸いです。では、ごゆっくりご覧ください。

尚、ご感想、ご意見、誤字、脱字、間違い等がありましたら遠慮なくPerlノート掲示板へご指摘ください。

◆ サイト最新情報

◆ コンテンツ

2008-02-10 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文フォーマット制限

◆ おすすめ Perl本

■ 続・初めてのPerl 改訂版

『初めてのPerl』の次ぎに読むと吉です。

結構いいですが・・・、初心者にはちょっと難しいかもです。

■ 結城浩のPerlクイズ

この本には、ちゃいちゃんパパの小話しが載っています(謎)。

ある程度、Perlを理解している人には、たまらない内容になっています。さすが結城先生だな!

結城浩のPerlクイズ

■ 新版Perl言語プログラミングレッスン入門編

実は、私はまだ読んでいませんが、結城先生の本なので良くないはずがありません。

新版Perl言語プログラミングレッスン入門編

■ CGI&Perlポケットリファレンス (Pocket reference)

この本は、非常に役に立ちます。ちょっと調べるのに最適です。サンプルも説明も的を射ています。

CGI&Perlポケットリファレンス (Pocket reference)

■ Perlベストプラクティス

一読の価値有りだと思います。

Perlベストプラクティス

■ プログラミングPerl〈VOLUME1〉

ご存知、Perl本の聖書、ラクダ本(上)です。

■ プログラミングPerl〈VOLUME2〉

ご存知、Perl本の聖書、ラクダ本(下)です。

◆ おわりに

最後に、本ページが、何かのお役に立てれば幸いです。

尚、ご感想、ご意見、誤字、脱字、間違い等がありましたら遠慮なくPerlノート掲示板へご指摘ください。

HTML/ CSS/ CGI-Perl/ JavaScript/ JavaApplet/ AccessUp/ Internet/ EnglishLearn/ ちゃいちゃん天使/ 天使メッセージ/ 飯田ワールド/ 結城ワールド/ プロフィール/ WEB相談室/ WEBアンテナ/ WEBリーダー/ 燈明日記/ yahoo

人のよいところをどんどん見つけよう