³»¿ë
±âÃÊ
Á¢¼Ó ¸¸µé±â
¿É¼Çµé
SQL »ç¿ëÇϱâ
Áß±Þ
SELECT statements
°í±Þ
Transactions
ÁÖÀÇ
Other Resources
À̹®¼ÀÇ ¸ñÀûÀº Perl DBI modulesÀ» ÀÌ¿ëÇÑ µ¥ÀÌÅͺ£À̽º Á¢±Ù¿¡ ´ëÇÑ ¿¹Á¦¸¦ Á¦°øÇÏ´Â °ÍÀÌ´Ù. À̰ÍÀ» ÀÛ¼ºÇÏ°Ô µÈ ÀÌÀ¯´Â DBI mailing list¿¡ ³Ê¹« ¸¹Àº Æ®·¡ÇÈÀÌ °É¸®±â ¶§¹®ÀÌ´Ù.
ÀÌ ¹®¼´ë·Î ÁøÇàÇϸé DBI¸¦ ÀÌ¿ëÇÏ¿© ¿À¶óŬ µ¥ÀÌŸº£À̽º·Î Á¢±ÙÇÏ´Â ¹æ½ÄÀ» ¹è¿ì°Ô µÉ °ÍÀÌ´Ù. DBI ±âÃÊ·Î ºÎÅÍ ½ÃÀÛÇÏ¿© ¼º´É°ú ½Å·Ú¼ºÀ» Çâ»ó½ÃŰ´Â ¹æÇâÀ¸·Î ÁøÇàÇÏ°Ô µÉ°ÍÀÌ´Ù.
±âÃÊ
óÀ½À¸·Î ÇØ¾ß ÇÒ°ÍÀº DBI¸¦ ¼³Ä¡ÇÏ´Â ÀÏÀÌ´Ù. À̰ÍÀ» À§Çؼ DBI INSTALL ¹®¼¸¦ ÂüÁ¶Çϱ⠹ٶõ´Ù. À̰ÍÀÌ ´Ù µÇ°í ³ª¸é database driver ¶Ç´Â DBD¸¦ ¼³Ä¡ÇÒ Çʿ䰡 ÀÖ´Ù. DBD¸¦ ¼³Ä¡Çϱâ À§ÇÑ ¼³¸í ¿ª½Ã °¢°¢ÀÇ package ³»¿¡ Æ÷ÇԵǾî ÀÖ´Ù. ´ëºÎºÐÀÇ perl ¸ðµâµéó·³ DBI/DBD¸¦ ¼³Ä¡ÇÏ´Â °ÍÀº ½±°í °£ÆíÇÏ°Ô µÇ¾î ÀÖ´Ù.
localhost:/opt/src/perl_modules/DBI-1.02$ perl Makefile.PL && make && make test && make install
DBI¿Í DBD¸¦ ÀûÀýÇÏ°Ô ¼³Ä¡ÇÏ°í ³ ÈÄ, ´ÙÀ½°ú °°Àº ¹æ½ÄÀ¸·Î Á»´õ ÀÚ¼¼ÇÑ Á¤º¸¸¦ ¾òÀ» ¼ö ÀÖ´Ù:
localhost:~$ perldoc DBI
µ¥ÀÌÅͺ£À̽º·Î Á¢¼ÓÇϱâ
µ¥ÀÌÅͺ£À̽º·Î Á¢±ÙÇÏ´Â °ÍÀº µ¥ÀÌÅͺ£À̽ºÀÇ Á¾·ù¿¡ µû¶ó ´Ù¸¥ ¹æ½ÄÀ» ÇÊ¿ä·Î ÇÑ´Ù. ÀÌ·± ±¤¹üÀ§ÇÑ Á¤º¸´Â DBD¿Í ÇÔ²² Á¦°øµÇ´Â ¹®¼¸¦ ÀÐ¾î º¸±â ¹Ù¶õ´Ù. ÀÌ ¿¹Á¦´Â ¿À¶óŬ·Î Á¢¼ÓÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ¼ ÁÖ·Î ³íÇÏ°Ô µÉ°ÍÀÌ´Ù.
use strict;
use DBI;
my $dbh = DBI->connect( 'dbi:Oracle:orcl',
'jeffrey',
'jeffspassword',
);
À§ÀÇ Á¢¼Ó ¹®ÀÚ¿¿¡´Â data source name, username ±×¸®°í password µîÀÇ ¼¼°³ÀÇ ÀÎÀÚ¸¦ ÇÊ¿ä·Î ÇÑ´Ù. DSNÀº dbi:DriverName:instanceÀÇ ÇüÅ·ΠÀÖ´Ù. ±×·¯³ª Á¢¼ÓÀÌ ¼º°øÇß´ÂÁö ¾ÈÇß´ÂÁö¸¦ ¾î¶»°Ô ¾Ë°ÍÀΰ¡? ¸ÕÀú ¼º°øÇß´Ù¸é connect´Â Âü°ª (true value)À» ±×·¸Áö ¾Ê´Ù¸é °ÅÁþ°ªÀ» µ¹·Á ÁÙ°ÍÀÌ´Ù. µÑ°·Î DBI´Â package ³»¿¡ ÀÖ´Â $DBI::errstr º¯¼ö¿¡ ¿¡·¯ ¸Þ½ÃÁö¸¦ ³Ö¾î µÐ´Ù.
use strict;
use DBI;
my $dbh = DBI->connect( 'dbi:Oracle:orcl',
'jeffrey',
'jeffspassword',
) || die "Database connection not made: $DBI::errstr";
$dbh->disconnect();
disconnect() method ¸¦ ÀÌ¿ëÇÏ¿© "Database handle destroyed without explicit disconnect" ¿¡·¯¸¦ ÇÇÇÒ ¼ö ÀÖ´Ù.
¿É¼Çµé
connect() method ´Â ¿É¼Ç hash¸¦ ÃëÇÑ´Ù. ÀÚÁÖ »ç¿ëµÇ´Â ¿É¼Ç¿¡´Â ´ÙÀ½°ú °°Àº °ÍµéÀÌ ÀÖ´Ù: AutoCommit, ÀÌ °ªÀÌ ÂüÀ̶ó¸é µ¥ÀÌÅͺ£À̽º transactionÀ» ÀÚµ¿À¸·Î commit ÇÏ°Ô µÈ´Ù; RaiseError, À̰ÍÀº ¿¡·¯°¡ ¹ß»ýÇßÀ» ¶§ DBIÀÇ ºÒÆòÀ» $DBI::errstr ¿¡°Ô ¾Ë·Á ÁØ´Ù; PrintError, À̰ÍÀº DBI°¡ $DBI::errstr¿¡ °æ°í¸¦ ³Ö¾î ÁØ´Ù.
ÀÌ ÇÁ·Î±×·¥¿¡¼, Æ®·£Á§¼ÇÀ» »ç¿ëÇÒ·Á°í ÇÑ´Ù. ±×·¡¼ AutoCommit´Â off·Î, RaiseError´Â onÀ¸·Î, ±×¸®°í PrintError´Â ±âº»°ªÀ¸·Î ³²°Ü µÎ¾ú´Ù.
use strict;
use DBI;
my $dbh = DBI->connect( 'dbi:Oracle:orcl',
'jeffrey',
'jeffspassword',
{
RaiseError => 1,
AutoCommit => 0
}
) || die "Database connection not made: $DBI::errstr";
$dbh->disconnect();
µ¥ÀÌÅͺ£À̽ºÀÇ AutoCommitÀ» off·Î µÎ¾ú´Ù´Â °ÍÀ» ¸í½ÉÇØ¾ß ÇÑ´Ù. À̰ÍÀº Æ®·£Á§¼Ç¿¡ Ä¡¸íÀûÀÎ ¿À·ù°¡ ¹ß»ýÇßÀ» °æ¿ì¿¡´Â Áö¿øÇÏÁö ¾Ê´Â´Ù´Â °ÍÀÌ´Ù.
SQL »ç¿ëÇϱâ
ÀÌÁ¦ ¿ì¸®´Â µ¥ÀÌŸº£À̽º¸¦ °¡Áö°í ¹«¾ð°¡ À¯¿ëÇÑ °ÍÀ» ÇÒ Áغñ°¡ µÈ°ÍÀÌ´Ù. SQL ¹®À» µ¥ÀÌÅͺ£À̽º¿¡ Àü´ÞÇÏ´Â ¹æ¹ý¿¡´Â µÎ°¡Áö°¡ ÀÖ´Ù. SELECT¿Í °°Àº row¸¦ µ¹·Á ÁÖ´Â ÁúÀǵ鿡 ´ëÇØ ÁغñµÈ ¹æ½ÄÀ» Àû¿ëÇÒ °ÍÀÌ´Ù. CREATE, DELETE¿Í °°Àº ´Ù¸¥ ÁúÀǵéÀº do method¸¦ ÀÌ¿ëÇÒ °ÍÀÌ´Ù. ÈÄÀÚ¸¦ ¸ÕÀú ÇØº¸°í ÀüÀÚ´Â µÚ¿¡ ¼³¸íÇϰڴÙ.
ÀÌ ÇÁ·Î±×·¥Àº µ¥ÀÌÅͺ£À̽º ³»¿¡ employee ¶ó´Â Å×À̺íÀ» ¸¸µå´Â °ÍÀÌ´Ù.
use strict;
use DBI;
my $dbh = DBI->connect( 'dbi:Oracle:orcl',
'jeffrey',
'jeffspassword',
{
RaiseError => 1,
AutoCommit => 0
}
) || die "Database connection not made: $DBI::errstr";
my $sql = qq{ CREATE TABLE employees ( id INTEGER NOT NULL,
name VARCHAR2(128),
title VARCHAR2(128),
phone CHAR(8)
) };
$dbh->do( $sql );
$dbh->disconnect();
Áß±Þ
¾î¶»°Ô µ¥ÀÌÅͺ£À̽º·Î Á¢±ÙÇϸç, ¾î¶»°Ô ¿¡·¯¸¦ ¾Ë¾Æ³»¸ç, ¾î¶»°Ô ´Ü¼øÇÑ SQL¹®À» ½ÇÇà ÇÒ°ÍÀÎÁö¿¡ ´ëÇØ º¸°Ô µÉ °ÍÀÌ´Ù. ÀÌÁ¦ Á»´õ ½Ç¿ëÀûÀÎ Äڵ带 ÀÛ¼ºÇØ º¸ÀÚ.
SELECT ±¸¹®
SELECT ±¸¹®Àº SQL¿¡¼ °¡Àå ¸¹ÀÌ ÀÌ¿ëµÇ´Â ¹®ÀåÀÏ °ÍÀÌ´Ù. SELECT¸¦ ÀÌ¿ëÇϱâ À§ÇÏ¿©, ¸ÕÀú ±¸¹®À» Áغñ(Prepare)ÇÏ°í ±×°ÍÀ» ½ÇÇà(Execute)ÇØ¾ß ÇÑ´Ù. ´ÙÀ½ Äڵ忡¼ $sth´Â ±¸¹® ÇÚµé(statement handle)ÀÌ´Ù. À̰ÍÀº SELECT¹®ÀÇ °á°ú·Î Á¢±ÙÇϰíÀÚ ÇÒ ¶§ ÀÌ¿ëµÉ °ÍÀÌ´Ù.
use strict;
use DBI;
my $dbh = DBI->connect( 'dbi:Oracle:orcl',
'jeffrey',
'jeffspassword',
{
RaiseError => 1,
AutoCommit => 0
}
) || die "Database connection not made: $DBI::errstr";
my $sql = qq{ SELECT * FROM employees };
my $sth = $dbh->prepare( $sql );
$sth->execute();
$dbh->disconnect();
À§¿¡ ³ª¿µÈ ÄÚµå´Â µ¥ÀÌÅͺ£À̽º°¡ ±¸¹®¿¡ ´ëÇØ ½ÇÇà °èȹÀ» ¼¼¿ì°í ±×·¯°í ³ª¼ ±¸¹®À» ½ÇÇàÇÏ´Â °ÍÀÌ´Ù. °á°ú·Î µ¹¾Æ¿Â rowµéÀ» °¡Áö°í ¾î¶² ÀÛ¾÷À» ÇÏÁö´Â ¾Ê´Â´Ù. ´ÙÀ½¿¡ ³ª¿µÈ Äڵ忡¼´Â µ¥ÀÌÅͺ£À̽º·Î ºÎÅÍ ³ª¿Â ·¹ÄÚµåµéÀ» ¾ò±â À§ÇÏ¿© bind_columnsÀ» »ç¿ëÇÏ´Â °ÍÀÌ´Ù. fetch°¡ È£ÃâµÇ¸é ±×°ÍÀº µ¥ÀÌÅͺ£À̽º·Î ºÎÅÍ µ¹¾Æ¿Â °ªµé·Î ä¿öÁö°Ô µÈ´Ù.
use strict;
use DBI;
my $dbh = DBI->connect( 'dbi:Oracle:orcl',
'jeffrey',
'jeffspassword',
{
RaiseError => 1,
AutoCommit => 0
}
) || die "Database connection not made: $DBI::errstr";
my $sql = qq{ SELECT id, name, title, phone FROM employees };
my $sth = $dbh->prepare( $sql );
$sth->execute();
my( $id, $name, $title, $phone );
$sth->bind_columns( undef, \$id, \$name, \$title, \$phone );
while( $sth->fetch() ) {
print "$name, $title, $phone\n";
}
$sth->finish();
$dbh->disconnect();
À̰ÍÀº ȸ»ç ÀüȺθ¦ Ãâ·ÂÇÏ´Â ÁÁÀº ÇÁ·Î±×·¥ÀÌ´Ù. ±×·¯³ª WHEREÀÌ ¾î¶°ÇѰ¡? ¿ì¸®´Â Çѹø SQL ¹®ÀåÀ» ÁغñÇϱâ À§ÇØ bind_paramÀ» »ç¿ëÇϰí, ´ë´ÜÈ÷ ºü¸£°Ô À̰ÍÀ» ¿©·¯¹ø ÀÌ¿ëÇß´Ù.
use strict;
use DBI;
my $dbh = DBI->connect( 'dbi:Oracle:orcl',
'jeffrey',
'jeffspassword',
{
RaiseError => 1,
AutoCommit => 0
}
) || die "Database connection not made: $DBI::errstr";
my @names = ( "Larry%", "Tim%", "Randal%", "Doug%" );
my $sql = qq{ SELECT id, name, title, phone FROM employees WHERE name LIKE ? };
my $sth = $dbh->prepare( $sql );
for( @names ) {
$sth->bind_param( 1, $_, $DBI::SQL_VARCHAR );
$sth->execute();
my( $id, $name, $title, $phone );
$sth->bind_columns( undef, \$id, \$name, \$title, \$phone );
while( $sth->fetch() ) {
print "$name, $title, $phone\n";
}
}
$sth->finish();
$dbh->disconnect();
°í±Þ
Transactions
ÀÌÁ¦±îÁö Æ®·£Àè¼ÇÀ» ¿äÇÏ´Â °ÍÀº ´Ù·ç¾î º¸Áö ¾Ê¾Ò´Ù. ¸¸¾à UPDATE ¶Ç´Â DELETE ¹®ÀåÀ» ½ÇÇàÇÒ Çʿ䰡 ÀÖ´Ù¸é Æ®·£Á§¼ÇÀ» »ç¿ëÇØ¾ß ÇÑ´Ù. DBI ¹®¼¿¡ µû¸£¸é, DBI¸¦ ÀÌ¿ëÇÏ¿© °ß°íÇÑ Æ®·£Á§¼ÇÀ» ±¸ÇöÇÒ·Á¸é ¿¡·¯¸¦ Àâ¾Æ³»±â À§Çؼ eval{...} blocksÀ» »ç¿ëÇØ¾ß Çϸç, Á¾·áÇÒ ¶§ commitÀ̳ª rollbackÀ» ÀÌ¿ëÇÑ´Ù. ´ÙÀ½ Äڵ忡¼ ¿¹Á¦¸¦ º¸¿©ÁÖ°í ÀÖ´Ù.
ÀÌ ÇÁ·Î±×·¥Àº ³×°³ÀÇ ·¹Äڵ带 µ¥ÀÌÅͺ£À̽º·Î ¿Ã¸®´Â °ÍÀÌ´Ù.
use strict;
use DBI;
my $dbh = DBI->connect( 'dbi:Oracle:orcl',
'jeffrey',
'jeffspassword',
{
RaiseError => 1,
AutoCommit => 0
}
) || die "Database connection not made: $DBI::errstr";
my @records = (
[ 0, "Larry Wall", "Perl Author", "555-0101" ],
[ 1, "Tim Bunce", "DBI Author", "555-0202" ],
[ 2, "Randal Schwartz", "Guy at Large", "555-0303" ],
[ 3, "Doug MacEachern", "Apache Man", "555-0404" ]
);
my $sql = qq{ INSERT INTO employees VALUES ( ?, ?, ?, ? ) };
my $sth = $dbh->prepare( $sql );
for( @records ) {
eval {
$sth->bind_param( 1, @$_->[0], $DBI::SQL_INTEGER );
$sth->bind_param( 2, @$_->[1], $DBI::SQL_VARCHAR );
$sth->bind_param( 3, @$_->[2], $DBI::SQL_VARCHAR );
$sth->bind_param( 4, @$_->[3], $DBI::SQL_VARCHAR );
$sth->execute();
$dbh->commit();
};
if( $@ ) {
warn "Database error: $DBI::errstr\n";
$dbh->rollback(); #just die if rollback is failing
}
}
$sth->finish();
$dbh->disconnect();
ÁÖÀÇ
¿¹Á¦¿¡¼ finish¸¦ »ç¿ëÇÏ´Â °ÍÀº ²À ÇÊ¿äÇÑ °ÍÀº ¾Æ´Ï´Ù. ¸¸¾à ´Ù ½ÇÇàÇÏ°í ³ª¸é ±¸¹®ÇÚµé (statement handele)À» ´Ù ½ÇÇàÇÏ°í ³ª¸é È£ÃâÇÏ´Â °ÍÀ̸ç, ÇÁ·Î±×·¥À» ´Ù ½ÇÇàÇÏ°í ³ª¼ È£ÃâÇÏ´Â °ÍÀº ¾Æ´Ï´Ù.
Ç×»ó use strict.
Other Resources
DBI at Hermetica
DBI mailing list information
DBI mailing list archives
Persistent connections with mod_perl
http://database.sarang.net/database/perl/dbi-example.html#connect
|
|