Perl und Oracle Instant Client

01.
September
2013
Veröffentlicht von: Helmut Exner

Installiert man die Oracle Datenbank Software, z. B. 11.2.0.3, so hat man alles was man braucht, um mit Perl SQL Statements auf einer lokalen oder entfernten Datenbank zu verarbeiten. Wenn sie aber lokal keine Perl Datenbank-Umgebung zur Verfügung haben, dann können Sie eine eigene Perl Umgebung mit dem DBI/DBD und dem Oracle Instant Client aufbauen.

Installiert man die Oracle Datenbank Software, z. B. 11.2.0.3, so hat man alles was man braucht, um mit Perl SQL Statements auf einer lokalen oder entfernten Datenbank zu verarbeiten.

Wenn sie aber lokal keine Perl Datenbank-Umgebung (wie im Monatstipp vom Opens external link in new windowAugust 2012 beschrieben) zur Verfügung haben, dann können Sie eine eigene Perl Umgebung mit dem DBI/DBD und dem Oracle Instant Client aufbauen.

 

1. LINUX

a. Installation von Perl in eigenem Verzeichnis

Z. B. /home/oracle/perl - separat von dem eventuell schon vorinstallierten Perl

oracle:~> cd /home/oracle
/home/oracle:~> mkdir perl
/home/oracle:~> cd perl

Feststellen, welche Version von Perl zum Download bereitsteht: Opens external link in new window http://www.cpan.org/src

Download (hier verwenden wir die Version 5.16.1) 

/home/oracle/perl:~> wget www.cpan.org/src/5.0/perl-5.16.1.tar.gz

Entpacken und installieren 

/home/oracle/perl>:~ tar -zxvf perl-5.16.1.tar.gz
/home/oracle/perl:~> cd perl-5.16.1
/home/oracle/perl/perl-5.16.1:~>
/home/oracle/perl/perl-5.16.1:~> ./Configure -des -Dprefix=/home/oracle/localperl
/home/oracle/perl/perl-5.16.1:~> make install

Welche Perl Versionen sind nun installiert ?

Vorinstallertes Perl vom Linux

/oracle:~> which perl
/usr/bin/perl

oracle:~> perl -v

This is perl, v5.8.8 built for x86_64-linux-thread-multi

Neues, soeben installiertes Perl 

PATH setzen für neues Perl

/home/oracle:~> export PATH=/home/oracle/perl/bin:$PATH

/home/oracle/perl/bin:~> ./perl -v

This is perl 5, version 16, subversion 1 (v5.16.1) built for x86_64-linux


b. Installation von DBI Modul

    (Ist bei der Perl Installation nicht dabei)

oracle:~> cd /home/oracle
/home/oracle:~> mkdir perlmodule
/home/oracle:~> cd perlmodule

Feststellen, welche Version des DBI Modules zum Download bereitsteht : Opens external link in new windowhttp://search.cpan.org/CPAN/authors/id/T/TI/TIMB

Download (hier verwenden wir die Version 1.622)

/home/oracle/perlmodule:~> wget search.cpan.org/CPAN/authors/id/T/TI/TIMB/DBI-1.622.tar.gz

Entpacken und installieren 

/home/oracle/perlmodule:~> tar -zxvf DBI-1.622.tar.gz
/home/oracle/perlmodule:~> cd DBI-1.622
/home/oracle/perlmodule/DBI-1.622:~> /home/oracle/perl/bin/perl Makefile.PL PREFIX=~/localperl
/home/oracle/perlmodule/DBI-1.622:~> make
/home/oracle/perlmodule/DBI-1.622:~> make install


c. Installation von Oracle Instant Client

Oracle Opens external link in new windowwww.oracle.com/technetwork/index.html
           - Downloads
              - Database
                - Instant Client (for Linux)

1.    Download the basic instant client
2.    Download the sdk instant client
3.    Download the sqlplus instant client

Hier verwenden wir die Instant Client Version: 11.2.0.3

Entpacken der Files

oracle:~> cd /home/oracle
/home/oracle:~> mkdir instant_client

oracle@s-tl-021 [HLT1]:~/instant_client> unzip instantclient-basic-linux.x64-11.2.0.3.0.zip
oracle@s-tl-021 [HLT1]:~/instant_client> unzip instantclient-sdk-linux.x64-11.2.0.3.0.zip
oracle@s-tl-021 [HLT1]:~/instant_client> unzip instantclient-sqlplus-linux.x64-11.2.0.3.0.zip


d. Installation von DBD Modul Oracle

    (Ist bei der Perl Installation auch nicht dabei)

Feststellen, welche Version des DBD-Oracle Modules zum Download bereitsteht: Opens external link in new windowhttp://search.cpan.org/CPAN/~pythian

Download (hier verwenden wir die Version 1.52)

oracle:~> cd /home/oracle/perlmodule
/home/oracle/perlmodule:~> wget search.cpan.org/CPAN/~pythian/DBD-Oracle-1.52.tar.gz

Setzen der Umgebungsvariablen

/home/oracle/perlmodule:~> export ORACLE_HOME=$HOME/instant_client/instantclient_11_2
/home/oracle/perlmodule:~> export LD_LIBRARY_PATH=$ORACLE_HOME

Entpacken und installieren

/home/oracle/perlmodule:~> tar -zxvf DBD-Oracle-1.52.tar.gz
/home/oracle/perlmodule:~> cd DBD-Oracle-1.52
/home/oracle/perlmodule/DBD-Oracle-1.52:~> /home/oracle/perl/bin/perl Makefile.PL PREFIX=~/perl
/home/oracle/perlmodule/DBD-Oracle-1.52:~> make
/home/oracle/perlmodule/DBD-Oracle-1.52:~> make install


e. Testen der Installation

/home/oracle:~> perl -MDBI -le 'print DBI->VERSION()';

1.622

/home/oracle:~> perl -MDBD::Oracle -le 'print $DBD::Oracle::VERSION;'

1.52


f. Anlegen der TNSNAMES.ora

/home/oracle:~> cd instant_client/instantclient_11_2
/home/oracle/instant_client/instantclient_11_2:~> mkdir network/admin
/home/oracle/instant_client/instantclient_11_2:~> vi network/admin/tnsnames.ora

ORCL=
    (DESCRIPTION =
      (SDU = 32767)
      (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP) (HOST = <HOSTNAME>)
                   (PORT = <PORT>))
      )
      (CONNECT_DATA =
      (SERVICE_NAME = <SID>)
      )
     )


g. Test mit einem Perl Skript

Skript: test_DBI_01.pl

#!/usr/bin/env perl

use strict;
use DBI;
use DBD::Oracle;
my @row;

my $oracle_user="scott";
my $oracle_password="tiger";

#### Connect zur Datenbank

my $dbh = DBI->connect("DBI:Oracle:ORCL",$oracle_user,$oracle_password,
                        {AutoCommit => 0, RaiseError => 1 });

if($dbh){
        print "\n";
        print("Connected als user $oracle_user\n");
} else {
        print "\n";
        print("Fehler beim connect!\n");
        exit;
}

#### Prepare und Execute ein SQL Statement

my $sth = $dbh->prepare("SELECT table_name,tablespace_name FROM user_tables");

$sth->execute();

print "\n";
print("table_name \ttablespace_name\n");
print("-----------\t---------------\n");

while(@row = $sth->fetchrow_array()){
      printf "%-15s %-15s\n",$row[0], $row[1];
}

#### Disconnect von der Datenbank

if($dbh->disconnect){
        print "\n";
        print("Disconnected\n");
} else {
        print "\n";
        print("Fehler beim disconnect\n");
}

Setzen der Umgebungsvariablen

/home/oracle/perlmodule/DBD-Oracle-1.52:~> export ORACLE_HOME=$HOME/instant_client/instantclient_11_2
/home/oracle/perlmodule/DBD-Oracle-1.52:~> export LD_LIBRARY_PATH=$ORACLE_HOME
/home/oracle:~> export PATH=/home/oracle/localperl/bin:$PATH

Ausführen des Skripts

/home/oracle:~> ./test_DBI_01.pl

Wenn diese Fehlermeldung auftritt, dann ist NLS_LANG nicht gesetzt! 

DBI connect('ORCL','scott',...) failed: ORA-12705: Cannot access NLS data files or invalid environment specified (DBD ERROR: OCISessionBegin) at ./test_DBI_01.pl line 13.
oracle@[ORCL]:~/perl>

Setzen NLS_LANG z. B. auf AMERICAN_AMERICA.AL32UTF8

oracle@[ORCL]:~/perl_script> export NLS_LANG=AMERICAN_AMERICA.AL32UTF8

/home/oracle:~> ./test_DBI_01.pl


Connected als user scott

table_name      tablespace_name
-----------     ---------------
DEPT            USERS
BONUS           USERS
SALGRADE        USERS
EMP             USERS

Disconnected

 

2. WINDOWS

a. Installation von Perl

Download: z. B. ActivePerl (Version 5.16)

Installation : Microsoft Installer (MSI) - ActivePerl-5.16.1.1601-MSWin32-x64-296175.msi

C:\Program Files (x86)\Perl64

DBI/DBD::Oracle Modul wird mit installiert!


b. Test der installierten Perl Version

C:\Users\> set Path=C:\Program Files (x86)\Perl64\site\bin;%PATH% (Wird normalerweise bei der Installation schon gesetzt) !

C:\Users\>perl -v

This is perl 5, version 16, subversion 1 (v5.16.1) built for MSWin32-x64-multi-thread
(with 1 registered patch, see perl -V for more detail)

C:\Users\>perl -MDBI -le "print DBI->VERSION()";
1.622

C:\Users\>perl -MDBD::Oracle -le "print $DBD::Oracle::VERSION";
1.50


c. Installation von Oracle Install Client

Oracle Opens external link in new windowwww.oracle.com/technetwork/index.html
            - Downloads
              - Database
                - Instant Client (for Microsoft Windows)

1.    Download the basic instant client
2.    Download the sdk instant client
3.    Download the sqlplus instant client

Hier verwenden wir die Instant Client Version: 11.2.0.3

Entpacken der 3 Files

z.B. nach             : c:\oracle\instant_client

Gibt dann Verzeichnis : c:\oracle\instant_client\instantclient_11_2

Oracle_Home setzen    : set ORACLE_HOME=c:\oracle\instant_client\instantclient_11_2


d. Installation eventuell des neuesten DBD Moduls

PPM (Programmer's Package Manager) ist ein Package Management Utility für ActivePerl. Es wird automatisch mit ActivePerl installiert.

PPM ist häufig auf Microsoft-Windows-Betriebssystemen anzutreffen, da es dort üblicherweise keine C- und C++-Kompiler gibt.

C:\Users\>ppm search DBD

(gekürzte Ausgabe)
................................
13: DBD-Oracle 1.52
................................

Man kann nun mit der Package Nummer 13 das DBD Modul installieren.

c:\Users\>ppm install 13

Downloading DBD-Oracle-1.52...done
Unpacking DBD-Oracle-1.52...done
Generating HTML for DBD-Oracle-1.52...done
Updating files in site area...done
34 files installed


e. Testen der Installation

C:\Users\>perl -MDBD::Oracle -le "print $DBD::Oracle::VERSION";
1.52


f. Anlegen der TNSNAMES.ora

Erstellen der TNSNAMES.ora in "c:\oracle\instant_client\instantclient_11_2\network\admin"

ORCL =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = <hostname>)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SID = ORCL)
    )
  )


e. Test mit einem Perl Skript

Skript: test_DBI_02.pl

#!/usr/bin/env perl

use strict;
use DBI;
use DBD::Oracle;

my $oracle_user="scott";
my $oracle_password="tiger";
my $oracle_sid="ORCL";

#### Connect zur Datenbank

my $dbh = DBI->connect("DBI:Oracle:$oracle_sid",$oracle_user,$oracle_password,
                        {AutoCommit => 0, RaiseError => 1 });

if($dbh){
        print "\n";
        print("Angemeldet als Benutzer $oracle_user\n\n");
} else {
        print "\n";
        print("Fehler beim connect!\n");
        exit;
}

#### Prepare und Execute ein SQL Statement

my $sql = "SELECT empno,ename,job,mgr,sal,deptno FROM emp WHERE job LIKE ? AND sal > ? ";
my $sth = $dbh->prepare($sql);

$sth->bind_param(1,"MAN%");
$sth->bind_param(2,"1500");

$sth->execute();

my($empno, $ename, $job, $mgr, $sal, $deptno);
$sth->bind_columns(\$empno, \$ename, \$job, \$mgr, \$sal, \$deptno);
print "Ausgabe aller Manager deren Gehalt groesser als 1500 ist \n";
print "======================================================== \n\n";
printf "EMPNO %1s ENAME %2s JOB %7s MGR %4s SAL %2s DEPTNO \n";
printf "----- %1s ----- %2s --- %7s --- %4s --- %2s ------ \n";
print "\n";
while( $sth->fetch() ) {
   printf "%4s %8s %10s %8s %8d %4s \n",$empno, $ename, $job, $mgr, $sal, $deptno;
}
$sth->finish();
$dbh->disconnect;

Setzen der Umgebungsvariablen

set ORACLE_HOME=c:\oracle\instant_client_11203\instantclient_11_2
set Path=C:\Program Files (x86)\Perl64\site\bin;  (Sollte schon gesetzt sein) !
set PATH=c:\oracle\instant_client\instantclient_11_2;%PATH%

Ausführen des Skripts

c:\Users>perl test_DBI_02.pl

Angemeldet als Benutzer scott

Ausgabe aller Manager deren Gehälter groesser als 1500 ist
==========================================================

EMPNO   ENAME    JOB         MGR      SAL    DEPTNO
-----   -----    ---         ---      ---    ------

7566    JONES    MANAGER     7839     2975   20
7698    BLAKE    MANAGER     7839     2850   30

Zusammenfassung

Wie man sieht, lassen sich auch mit einer eigenen installierten Perl Umgebung relativ einfach SQL-Statements auf einer entfernten Oracle Datenbank ausführen.

Jede Menge Know-how für Sie!

In unserer Know-How Datenbank finden Sie mehr als 300 ausführliche Beiträge zu den Oracle-Themen wie DBA, SQL, PL/SQL, APEX und vielem mehr.
Hier erhalten Sie Antworten auf Ihre Fragen.