Perl DBI

Perl DBI Example

The DBI module enables your Perl applications to access

multiple database types transparently. You can connect to

MySQL, MSSQL, Oracle, Informix, Sybase, ODBC etc. without

having to know the different underlying interfaces of each.

The API defined by DBI will work on all these database types

and many more.

What is DBI and DBD::Oracle and where can one get it from?

DBI (previously called DBperl) is a database independent interface module for Perl. It defines a set of methods, variables and conventions that provide a consistent database interface independent of the actual database being used.

DBD::Oracle is the Oracle specific module for DBI. It can be downloaded from CPAN.

What DBI drivers have I got?

In DBI you can programmatically discover what DBI drivers are installed.

  #!/usr/bin/perl -w  require DBI;    my @drivers = DBI->available_drivers;  print join(", ", @drivers), "n";  


Example:

  use strict;  use DBI;  my $dbh = DBI->connect( 'dbi:Oracle:orcl',                          'username',                          'password',                          {                            RaiseError => 1,                            AutoCommit => 0                          }                        ) || die "Database connection not made: $DBI::errstr";    my $sql = qq{ CREATE TABLE employees ( id INTEGER NOT NULL,                                         name VARCHAR2(128),                                         position VARCHAR2(128),                                       ) };  $dbh->do( $sql );  $dbh->disconnect();  

SYBASE

Sybperl implements three Sybase extension modules to perl (version 5.002 or higher). Sybase::DBlib adds a subset of the Sybase DB-Library API. Sybase::CTlib adds a subset of the Sybase CT-Library (aka the Client Library) API. Sybase::Sybperl is a backwards compatibility module (implemented on top of Sybase::DBlib) to enable scripts written for sybperl 1.0xx to run with Perl 5. Using both the Sybase::Sybperl and Sybase::DBlib modules explicitly in a single script is not garanteed to work correctly.

The general usage format for both Sybase::DBlib and Sybase::CTlib is this:

use Sybase::DBlib;  # Allocate a new connection, usually refered to as a database handle  $dbh = new Sybase::DBlib username, password;  # Set an attribute for this dbh:  $dbh->{UseDateTime} = TRUE;  # Call a method with this dbh:  $dbh->dbcmd(sql code);  

The DBPROCESS or CS_CONNECTION that is opened with the call to new() is automatically closed when the $dbh goes out of scope:

  sub run_a_query {  my $dbh = new Sybase::CTlib $user, $passwd;  my @dat = $dbh->ct_sql("select * from sysusers");  return @dat;  }  # The $dbh is automatically closed when we exit the subroutine.  

Sybase::DBlib

A generic perl script using Sybase::DBlib would look like this:

  use Sybase::DBlib;  $dbh = new Sybase::DBlib 'sa', $pwd, $server, 'test_app';  $dbh->dbcmd("select * from sysprocessesn");  $dbh->dbsqlexec;  $dbh->dbresults;  while(@data = $dbh->dbnextrow)  {   .... do something with @data ....  }  

$dbh = Sybase::DBlib->dbopen([$server [, $appname, [{attributes}] ]])

Open an additional connection, using the current LOGINREC information.

$status = $dbh->dbuse($database)

Executes “use database $database” for the connection $dbh.

$status = $dbh->dbcmd($sql_cmd)

Appends the string $sql_cmd to the current command buffer of this connection.

$status = $dbh->dbsqlexec

Sends the content of the current command buffer to the dataserver for execution. See the DB-library documentation for a discussion of return values.

$status = $dbh->dbresults

Retrieves result information from the dataserver after having executed dbsqlexec().

$status = $dbh->dbcancel

Cancels the current command batch.

$status = $dbh->dbcanquery

Cancels the current query within the currently executing command batch.

$dbh->dbfreebuf

Free the command buffer (required only in special cases – if you don’t know what this is you probably don’t need it 🙂

$dbh->dbclose

Force the closing of a connection. Note that connections are automatically closed when the $dbh goes out of scope.

$dbh->DBDEAD

Returns TRUE if the DBPROCESS has been marked DEAD by DBlibrary.

$status = $dbh->DBCURCMD

Returns the number of the currently executing command in the command batch. The first command is number 1.

$status = $dbh->DBMORECMDS

Returns TRUE if there are additional commands to be executed in the current command batch.

$status = $dbh->DBCMDROW

Returns SUCCEED if the current command can return rows.

$status = $dbh->DBROWS

Returns SUCCEED if the current command did return rows

$status = $dbh->DBCOUNT

Returns the number of rows that the current command affected.

$row_num = $dbh->DBCURROW

Returns the number (counting from 1) of the currently retrieved row in the current result set.

$status = $dbh->dbhasretstat

Did the last executed stored procedure return a status value? dbhasretstats must only be called after dbresults returns NO_MORE_RESULTS, ie after all the selet, insert, update operations of he sored procedure have been processed.

$status = $dbh->dbretstatus

Retrieve the return status of a stored procedure. As with dbhasretstat, call this function after all the result sets of the stored procedure have been processed.

$status = $dbh->dbnumcols

How many columns are in the current result set.

$status = $dbh->dbcoltype($colid)

What is the column type of column $colid in the current result set.

$status = $dbh->dbcollen($colid)

What is the length (in bytes) of column $colid in the current result set.

$string = $dbh->dbcolname($colid)

What is the name of column $colid in the current result set.

@dat = $dbh->dbretdata[$doAssoc])

Retrieve the value of the parameters marked as ‘OUTPUT’ in a stored procedure. If $doAssoc is non-0, then retrieve the data as an associative array with parameter name/value pairs.

If you have found my website useful, please consider buying me a coffee below 😉