Tipps & Tricks: September 2013 Bereich: DBA Erstellung: 09/2013 HE Versionsinfo: 11.2 Letzte Überarbeitung: 09/2013 HE Perl und Oracle Instant Client 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 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. 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: http://www.cpan.org/src Download (hier verwenden wir die Version 5.16.1) /home/oracle/perl:~> wget http://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 Muniqsoft GmbH Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40 IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0 Seite 1 von 9 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 http://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. 2. 3. Download the basic instant client Download the sdk instant client Download the sqlplus instant client Hier verwenden wir die Instant Client Version: 11.2.0.3 Entpacken der Files Muniqsoft GmbH Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40 IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0 Seite 2 von 9 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 http://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 Muniqsoft GmbH Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40 IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0 Seite 3 von 9 /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]; Muniqsoft GmbH Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40 IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0 Seite 4 von 9 } #### 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 ----------DEPT BONUS SALGRADE EMP tablespace_name --------------USERS USERS USERS USERS Disconnected Muniqsoft GmbH Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40 IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0 Seite 5 von 9 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:\Users\> c. Installation von Oracle Install Client Oracle www.oracle.com/technetwork/index.html - Downloads - Database - Instant Client (for Microsoft Windows) 1. 2. 3. Download the basic instant client Download the sdk instant client 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 Muniqsoft GmbH Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40 IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0 Seite 6 von 9 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 ................................ c:\Users\> 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 c:\Users\> 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 Muniqsoft GmbH Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40 IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0 Seite 7 von 9 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 Muniqsoft GmbH Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40 IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0 Seite 8 von 9 Angemeldet als Benutzer scott Ausgabe aller Manager deren Gehälter groesser als 1500 ist ========================================================== EMPNO ----- ENAME ----- JOB --- MGR --- SAL --- DEPTNO ------ 7566 7698 JONES BLAKE MANAGER MANAGER 7839 7839 2975 2850 20 30 c:\Users> Zusammenfassung Wie man sieht, lassen sich auch mit einer eigenen installierten Perl Umgebung relativ einfach SQL-Statements auf einer entfernten Oracle Datenbank ausführen. Muniqsoft GmbH Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40 IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0 Seite 9 von 9