標籤:target 記錄 linux環境配置 archive 控制代碼 free 問題解決 應該 bin
前言
接手前輩的項目,沒有接觸、安裝、使用過perl和DBD::Oracle,也沒有相關的文檔記錄,茫茫然不知所措~~。一開始發現這個問題,就想著迅速解決,就直接在google上搜報錯資訊,搜尋的過程中發現 如果不搞清楚前因後果我連解決方案都‘看不見’‘看不懂’。 所以還是要補充這方面的知識,再思考解決方案。以下內容就是我一邊學習一邊解決問題的過程,如果不足,請各位大佬指出。
報錯
install_driver(Oracle) failed: Can‘t locate DBD/Oracle.pm in @INC (@INC contains:/home/as_user/PMS/Data-Update /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at (eval 12) line 3. Perhaps the DBD::Oracle perl module hasn‘t been fully installed, or perhaps the capitalisation of ‘Oracle‘ isn‘t right. Available drivers: DBM, ExampleP, File, Gofer, Pg, Proxy, SQLite, Sponge, mysql. at /home/as_user/PMS/Data-Update/SolexaDown.pl line 19
DBI相關知識
參考:菜鳥教程DBI相關
在perl中使用DBI的方法
1 #!/usr/bin/perl 2 use DBI; #perl引入DBI模組3 my $dbh = DBI->connect("dbi:Oracle:host=$host;sid=$sid", $user, $passwd); #DBI根據輸入的驅動程式對象的控制代碼調用對應的資料模組,返回一個資料庫物件的控制代碼
這個時候我的腦海裡出現了兩個問題
1.代碼中使用use,那use怎麼知道DBI所在的目錄,在哪裡設定了,和@INC有什麼關係???
2.DBI如何啟用DBD::Oracle,尋找的路徑是什麼,在哪裡,怎麼設定,和@INC有什麼關係???
上述問題可能會在配置DBD::Oracle中找到答案,所以我就先查詢學習了配置過程
配置方法DBD::Oracle
參考:Linux環境配置DBD::Oracle模組
要點
1. DBD::Oracle模組不是Oracle官方開發的,由Pythian Group公司開發,網址為https://metacpan.org/pod/DBD::Oracle,下載該模組的地址https://metacpan.org/release/MJEVANS/DBD-Oracle-1.75_2 。當然可以去CPAN(Comprehensive Perl Archive Network,Perl模組聚集庫https://www.cpan.org/)下載
2. 先裝DBI,再裝DBD模組,在安裝DBD::Oracle中,如果裝在沒有Oracle Database的主機上,則需要安裝Oracle Instant Client來進行遠端資料庫串連
3.在安裝教程中,指出要配置Orcale_HOME目錄,我們可以在根目錄下輸入vi .bashrc命令,即可看到Oracle_HOME的配置資訊
在安裝DBD::Oracle過程中,設定Oracle_HOME變數這一步似乎與我的問題2有關,但和問題1一點關係都沒有,這時候就懷疑perl中有設定相應的參數,仔細查看執行指令碼的開頭,發現有使用到FindBin,想著不瞭解那就去學習一下。幸運的是,在學習的過程中解決了我的疑惑和報錯。
perl的FindBin模組(一定要看參考的網址,很有協助)
要點1:
參考:Perl使用FindBin模組解決指令碼中的路徑問題
假定指令碼路徑在/home/as_user/PMS/testt.pl,在目錄/home/as_user/PMS下運行該指令碼
即$bin表示路徑/home/as_user/PMS,$Script表示testt.pl
要點2:
參考:理解use_require_do使用方法
use 是在預設的@INC裡面去尋找對應的模組,一旦模組不在@INC中,那麼use是不能引入的。同時use引入的名稱不需要尾碼名,預設同時也只能找.PM檔案
要點3:
參考:查看Perl模組安裝路徑
@INC是perl的一個特殊列表標量,儲存著目前的版本的Perl模組的路徑。編譯指令碼時,Perl會根據@INC儲存的路徑去查詢使用者所調用的模組,可以用命令‘perl -V’來查看具體模組的目錄,也同樣可以用BEGIN代碼塊對@INC進行操作。其中.表示指令碼的目前的目錄。
總結
在學習了‘配置DBD::Oracle方法’ 以及‘perl的FindBin模組’的相關知識後,再回到報錯,報錯說在@INC路徑下Can‘t locate DBD/Oracle.pm,既然找不到,那麼我們要在執行指令碼中設定DBD/Oracle.pm的路徑。設定的方法是使用 FindBin模組。
舉個例子:執行指令碼SolexaDown.pl的目錄為 /home/as_user/PMS/Data-Update,在這個目錄下的/lib目錄下存在 DBD/Oracle.pm,即存在路徑 /home/as_user/PMS/Data-Update/DBD/Oracle.pm。那麼我在olexaDown.pl指令碼的開頭,應該寫上
use FindBin ‘$Bin‘;use lib "$Bin/lib";
這樣一來,perl執行SolexaDown.pl指令碼時就能找到DBD/Oracle.pm了。問題解決了~~
linux centos環境下,perl使用DBD::Oracle遇到報錯Can't locate DBDOracle.pm in @INC 的解決辦法