#!/usr/bin/perl
use strict;	# 変数のスコープを指定と宣言を強要する
use DBI;	# DBIの使用を宣言

# 接続用変数
my $DB_NAME = "postgres";	# ＤＢ名
my $DB_HOST = "localhost";	# ホスト名
my $DB_USER = "postgres";	# ユーザー
my $DB_PASS = "postgres";	# パスワード

# DBI->connect(データソース, ユーザー名, パスワード, その他のパラメータ)
# or die はエラー発生時にエラーメッセージを表示して処理を終了する
# 最後を\nにすると、行番号が表示されなくなる
print("# ＤＢ接続\n");
my $dbh = DBI->connect("dbi:Pg:dbname=$DB_NAME;host=$DB_HOST", "$DB_USER", "$DB_PASS")
	or die "$!\n ＤＢ接続エラー\n";

# delete id:999があるとinsert失敗するので先に削除
print("# 前準備の削除\n");
my $sth = $dbh->prepare("delete from table1 where id = ?;");
my $rv = $sth->execute(999);
my $rc = $sth->finish();

# select
# selectall_arrayrefは、selectの結果すべてを配列の参照で返す
my $ary_ref = $dbh->selectall_arrayref("select * from table1;");

print("# insert前の結果を表示\n");
foreach my $record (@$ary_ref) {
	print "\t$record->[0], ";
	print "$record->[1]\n";
}

# insert
my $sth = $dbh->prepare("insert into table1(id, name) values(?,?)");
my $rv = $sth->execute(999, "鈴木太郎");
my $rc = $sth->finish();

# select prepare > execute > fetchrow_arrayref
print("# insert後の結果を表示\n");
$sth = $dbh->prepare("select * from table1;");
$sth->execute();
# fetchrow_arrayrefは、一行の参照を返す
while(my $record = $sth->fetchrow_arrayref) {
	my ($id, $name) = @$record;	# $id $nameにまとめて値を設定
	print "\t$id, $name\n";
}
$rc = $sth->finish();

# delete
print("# 後処理の削除\n");
my $sth = $dbh->prepare("delete from table1 where id = ?;");
my $rv = $sth->execute(999);
my $rc = $sth->finish();

# ＤＢ切断
print("# ＤＢ切断\n");
$dbh->disconnect;


