- 論壇徽章:
- 0
|
Solaris8之后已經(jīng)帶有Perl,但其自帶的Perl版本有一定的局限性,無法編譯并使用DBI模塊。以下是從Perl連接Oracle的幾個基本步驟,在Solaris8上測試通過,貼出來與大家討論。
首先,卸載Solaris本身帶的Perl。Solaris8的安裝包是SUNWpl5u (Perl 5.005_03),版本太低,不支持新的DBI模塊1.42,但老一些的版本可以支持,比如說1.32。最主要的問題是,Solaris缺省的Perl是用Sun的CC編譯器編譯的,加入DBI模塊時,它要尋找CC編譯器,如果系統(tǒng)中沒有Sun的CC的話,編譯就不能繼續(xù)。Sun的CC編譯器是比較昂貴的,對于我們常用gcc的來說,使用Sun自帶的Perl很難擴展其功能。我們可以安裝一個gcc編譯的Perl克服這一問題。
* 查詢是否系統(tǒng)中帶有Solaris的Perl,用:
* pkginfo | grep –i perl
* 刪除Solaris的Perl, 用:
* pkgrm SUNWpl5u
可能系統(tǒng)中還存在另兩個Perl文檔的安裝包,也可以一并刪除。如果不想刪除自帶的Perl包的話,可以備份/usr/bin/perl文件,比如說備份為:
* mv /usr/bin/perl /usr/bin/perl.sun
然后進行g(shù)cc Perl的安裝。這樣要恢復(fù)回來,只要重新命名這一文件就可以了。
其次,安裝編譯Perl?梢詮木W(wǎng)上下載Perl的源碼,然后使用缺省configure就可以了。如果系統(tǒng)中沒有g(shù)cc的話,可以用Sun的"Software Companion CD"里安裝,安裝后路徑位于/opt/sfw下,也可以從http://www.sunfreeware.com上下載相應(yīng)的版本?梢园裀erl安裝在單獨的目錄之下,這樣便于以后的升級和管理,比如說/opt/SMCperl下。也可以從sunfreeware站點上直接下載編譯后的Perl,當前的版本是5.8.3,安裝后位于/usr/local/bin下。為避免不打亂原來程序的連接關(guān)系,把perl文件鏈接到/usr/bin下。
* ln –sf /opt/SMCperl/bin/perl /usr/bin/perl
接下來就可以安裝DBI模塊了。這一模塊可以從http://dbi.perl.org上下載。安裝過程跟一般的模塊相同,perl Makefile.PL; make;make install。DBI模塊提供了跟數(shù)據(jù)庫的接口,但要與某一數(shù)據(jù)庫連接,帶必須安裝相應(yīng)的DBD模塊。每一特定的數(shù)據(jù)庫都有其特定的DBD模塊(驅(qū)動),對Oracle來說,這一模塊可以從以下站點上下載(http://search.cpan.org/~timb/DBD-Oracle-1.15)。
如果使用64位的數(shù)據(jù)庫的話,直接編譯DBD-Oracle的源碼會有問題,因為缺省的make文件會指向的Oracle的64位庫文件。gcc要求所有的庫文件位數(shù)相同才可以進行編譯。另外,較低版本的gcc并不支持編譯64位的二進制文件。我用的是9i的64bit,gcc是2.95的,用了“-m64”后仍然有錯誤。以下是錯誤信息:
* ld: fatal: file /u01/oracle/product/9.2.0/lib//libclntsh.so: wrong ELF class: ELFCLASS64
如果出現(xiàn)這一錯誤的話,可以編輯DBD:Oracle的Makefile,然后把所有指向”9.2.0/lib”的都改為” 9.2.0/lib32”。重新編譯就可以了。
最后,可以測試一下連接了。以下是一段測試代碼。
* orahost是數(shù)據(jù)庫的主機名。
* dbuser是連接數(shù)據(jù)庫的用戶名。
* dbpass是用戶的密碼。
*****************************************************
#!/usr/bin/perl -w
use DBI;
my $dbh = DBI->;connect('DBI:Oracle:host=orahost;sid=SIDNAME;port=1521','dbuser','dbpass');
my $sql = qq{ select table_name from user_tables };
my $sth = $dbh->;prepare( $sql );
$sth->;execute();
while (my ($table_name) = $sth->;fetchrow_array()) {
print $table_name, "\n";
}
$sth->;finish();
$dbh->;disconnect(); |
|