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 <link blog-detailansicht perl-und-oracle.html external-link-new-window internal link in current>August 2012 beschrieben) zur Verfügung haben, dann können Sie eine eigene Perl Umgebung mit dem DBI/DBD und dem Oracle Instant Client aufbauen.
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: 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 : http://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 www.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: http://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
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 www.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.
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.