linux centos環境下,perl使用DBD::Oracle遇到報錯Can't locate DBDOracle.pm in @INC 的解決辦法

来源:http://www.cnblogs.com/achigwwblog/archive/2017/11/17/7853814.html
-Advertisement-
Play Games

前言 接手前輩的項目,沒有接觸、安裝、使用過perl和DBD::Oracle,也沒有相關的文檔記錄,茫茫然不知所措~~。一開始發現這個問題,就想著迅速解決,就直接在google上搜報錯信息,搜索的過程中發現 如果不搞清楚前因後果我連解決方案都‘看不見’‘看不懂’。 所以還是要補充這方面的知識,再思考 ...


前言

接手前輩的項目,沒有接觸、安裝、使用過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有什麼關係???

上述問題可能會在配置DBI,DBD::Oracle中找到答案,所以我就先查詢學習了配置過程

安裝DBI 

perl DBI官網: https://dbi.perl.org/ ,在官網中可以跳轉到下載路徑 https://metacpan.org/release/DBI

配置方法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了。報錯解決了~~

 

關於問題

use查找引用的模塊 和 DBI激活對應的DBD 都是通過 @INC下的路徑去查找的,之所以說DBI激活對應的DBD也是通過@INC的依據:我發現DBI有個available_drivers方法,perl DBI手冊上有寫到 "該方法通過@INC中的目錄搜索所有的DBD::*模塊返回一個所有可用驅動器的列表。預設情況下,如果某些驅動器被先前目錄中其他相同名字的驅動器覆蓋,將會返回一個警告,可以通過設置$quiet為true屏蔽",這啟發了我,再根據DBI的源碼,我發現了實際的代碼 grep { -d "$_/auto/DBD/$driver" } @INC。我懶的仔細看源碼,$_具體指哪些就沒深究,有興趣的可以仔細研究一下,DBI源碼是用perl寫的。設置@INC的方法在鏈接 查看Perl模塊安裝路徑中可以找到,我就不列舉了。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 上一篇文章介紹了使用Authorize特性實現了ASP.NET MVC中針對Controller或者Action的授權功能,實際上這個特性是MVC功能的一部分,被稱為過濾器(Filter),它是一種面向切麵編程(AOP)的實現,本章將從以下幾個方面來介紹ASP.NET MVC中的過濾器。 ● ASP ...
  • 首先出個題: 如圖: 假設對成長速度顯示規定如下: 成長速度為5顯示1個箭頭; 成長速度為10顯示2個箭頭; 成長速度為12顯示3個箭頭; 成長速度為15顯示4個箭頭; 其他都顯示都顯示0各箭頭。 用代碼怎麼實現? 差一點的if,else: Js代碼 var add_level = 0; if(ad ...
  • 背水一戰 Windows 10 之 控制項(控制項基類 - UIElement ): 拖放的基本應用, 手動開啟 UIElement 的拖放操作 ...
  • 在我們開發工作流模塊的時候,有時候填寫申請單過程中,暫時不想提交審批,那麼可以暫存為草稿,以供下次繼續填寫或者提交處理,那麼這個草稿的功能是比較實用的,否則對於一些填寫內容比較多的申請單,每次要重填寫很多數據,那會被用戶罵的,從用戶的角度上來講,提供草稿保存的功能是比較友好的。本篇隨筆介紹在工作流模... ...
  • 簡介 排序演算法是我們編程中遇到的最多的演算法。目前主流的演算法有8種。 平均時間複雜度從高到低依次是: 冒泡排序(o(n2)),選擇排序(o(n2)),插入排序(o(n2)),堆排序(o(nlogn)), 歸併排序(o(nlogn)),快速排序(o(nlogn)), 希爾排序(o(n1.25)),基數排 ...
  • 結構體List則表示鏈表這種數據結構(見示例1)。這個結構由5個成員組成:size表示鏈表中元素個數;match並不由鏈表本身使用,而是由鏈表數據結構派生而來的新類型所使用;destroy是封裝之後傳遞給list_init的析構函數;head是指向鏈表中頭結點元素的指針;tail則是指向鏈表中末尾結... ...
  • 一.電腦硬體介紹 概念:由一條匯流排把CPU、記憶體和I/O設備串聯起來並與其他設備進行通信。 CPU負責運算,記憶體用於儲存臨時變數,硬碟用於儲存數據 應用程式、操作系統及硬體的關係:參考應用程式的啟動流程 1. 處理器CPU( 寄存器+控制器 ) 取指令 解碼 執行 ,直到程式結束。 1. 通用寄存 ...
  • #00 在python裡面沒有常量,只有變數 #01刪除變數:del 變數名 #02coding:utf-8 //設置utf-8編碼 #03 單行註釋:#多行註釋:三個任意符號,一般用'''#04 table鍵和四個空格不相等,縮進要保持一致 我的IDLE中預設按tab鍵就是四個空格 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...