Perl is one of the more common scripting languages for which a 'standard' database application programming interface is defined. It is called DBI and it was designed to protect you from the API library details of multiple DBMS vendors. It has a very simple interface to execute SQL queries and for processing the results sent back. DBI doesn't know how to talk to any particular database, but it does know how to locate and load in DBD (`Database Driver') modules. The DBD modules encapsulate the interface library's intricacies and knows how to talk to the real databases.
MonetDB comes with its own DBD module which is included in both the source and binary distribution packages. It includes a few examples. The module is also available via CPAN.
For further documentation we refer to the Perl community home page.
use warnings;
use DBI();
print "\nStart a simple Monet MIL interaction\n\n";
# determine the data sources:
my @ds = DBI->data_sources('monetdb');
print "data sources: @ds\n";
# connect to the database:
my $dsn = 'dbi:monetdb:database=test;host=localhost;port=50000;language=mil';
my $dbh = DBI->connect( $dsn,
undef, undef, # no authentication in MIL
{ PrintError => 0, RaiseError => 1 } # turn on exception handling
);
{
# simple MIL statement:
my $sth = $dbh->prepare('print(2);');
$sth->execute;
my @row = $sth->fetchrow_array;
print "field[0]: $row[0], last index: $#row\n";
}
{
my $sth = $dbh->prepare('print(3);');
$sth->execute;
my @row = $sth->fetchrow_array;
print "field[0]: $row[0], last index: $#row\n";
}
{
# deliberately executing a wrong MIL statement:
my $sth = $dbh->prepare('( xyz 1);');
eval { $sth->execute }; print "ERROR REPORTED: $@" if $@;
}
$dbh->do('var b:=new(int,str);');
$dbh->do('insert(b,3,"three");');
{
# variable binding stuff:
my $sth = $dbh->prepare('insert(b,?,?);');
$sth->bind_param( 1, 7 , DBI::SQL_INTEGER() );
$sth->bind_param( 2,'seven' );
$sth->execute;
}
{
my $sth = $dbh->prepare('print(b);');
# get all rows one at a time:
$sth->execute;
while ( my $row = $sth->fetch ) {
print "bun: $row->[0], $row->[1]\n";
}
# get all rows at once:
$sth->execute;
my $t = $sth->fetchall_arrayref;
my $r = @$t; # row count
my $f = @{$t->[0]}; # field count
print "rows: $r, fields: $f\n";
for my $i ( 0 .. $r-1 ) {
for my $j ( 0 .. $f-1 ) {
print "field[$i,$j]: $t->[$i][$j]\n";
}
}
}
{
# get values of the first column from each row:
my $row = $dbh->selectcol_arrayref('print(b);');
print "head[$_]: $row->[$_]\n" for 0 .. 1;
}
{
my @row = $dbh->selectrow_array('print(b);');
print "field[0]: $row[0]\n";
print "field[1]: $row[1]\n";
}
{
my $row = $dbh->selectrow_arrayref('print(b);');
print "field[0]: $row->[0]\n";
print "field[1]: $row->[1]\n";
}
$dbh->disconnect;
print "\nFinished\n";