PerlでDBへNULLを書き込む時のvaluef関数
SQLのINSERTやUPDATEで書き込むデータを指定する時に、通常、文字列はシングルクォーテーションで囲み、数値とNULLはそのままになります。
しかし、数値に関してはシングルクォーテーションで囲んでも問題がないですね。
上記を踏まえて、Perlでvaluefという関数を作ってみました。
valuef関数は、引数が空文字列と未定義値の時はNULLとし、これ以外(数値と文字列)の時は、値をシングルクォーテーションで囲みます。
#!/usr/bin/perl use strict; my @Sql = (); my $Code=15; my $Level=(); my $Comment='11111111111'; $Sql[0] = "INSERT INTO tstTBL (Code, Level, Comment) "; $Sql[0] .= "VALUES (@{[valuef($Code)]}, @{[valuef($Level)]}, @{[valuef($Comment)]}) "; &SQLExecutor(@Sql); sub valuef { my ($para) = @_; my $rtvalue; if (($para eq '') || (!defined($para))) { $rtvalue = 'NULL'; } else { $rtvalue = "'" . $para . "'"; } return $rtvalue; } sub SQLExecutor { use Win32::OLE; Win32::OLE->Option(Warn => 3); my (@Sql) = @_; # データベースへの接続 my $objDB = Win32::OLE->new("ADODB.Connection"); # SQL Server 認証設定(WINDOWS認証の時は『Integrated Security=SSPI;』を付加する) my $connectStr = "Provider=sqloledb;". "Data Source=SERVER_NAME;". "Initial Catalog=DB_NAME;". "User ID=sa;". "Password=sa;"; # 接続を開く $objDB->Open($connectStr); if ($objDB->{Errors}->{Count}) { die "cannot connect '$connectStr'"; } $objDB->{CommandTimeout} = 100; foreach my $wkSQL (@Sql) { # データ更新 $objDB->Execute($wkSQL); } # 接続を閉じる $objDB->Close(); }
尚、SQLExecutorサブルーチンは、SQL Server系のDB専用です。
留意点として、SERVER_NAMEとDB_NAMEとsaは、本番用に書き換えが必要です。