国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > Oracle > 正文

BS結(jié)構(gòu)中使用PHP訪問ORACLE LOB

2024-08-29 13:32:27
字體:
供稿:網(wǎng)友
摘要:本文介紹了如何利用php的數(shù)據(jù)庫訪問技術(shù)實現(xiàn)對oracle lob數(shù)據(jù)對象的存儲。

  關鍵字:php;oracle; lob;存儲;

  引言

   php,即“php: hypertext preprocessor”,是一種廣泛用于 open source(開放源代碼)并可以嵌入 html 的多用途腳本語言。它的語法接近 c、java 和 perl,易于學習。該語言的主要目標是讓 web 開發(fā)人員快速的書寫動態(tài)生成的網(wǎng)頁,然而,php 的功能并不局限于此。php普遍被認為可以更快和更有效地實現(xiàn)復雜的編程任務,而且正是因為它的更穩(wěn)定以及占用更少資源的優(yōu)點成為開發(fā)b/s結(jié)構(gòu)系統(tǒng)的必備的web腳本設計語言,扮演著類似中間件的角色,即語法解析與執(zhí)行。

  oracle lob數(shù)據(jù)模型

   在b/s(browser/server,瀏覽器/服務器)應用系統(tǒng)中,需要存儲的已不僅僅是簡單的文字信息,同時還包括一些圖片和音像資料或者是超長的文本。比如開發(fā)一套公文系統(tǒng),公文中的圖表、附件等二進制文件或超長文本將無法使用普通的字符或其他類型的數(shù)據(jù)描述,這就要求后臺數(shù)據(jù)庫要有存儲這些數(shù)據(jù)的能力。運用oracle lob對象可實現(xiàn)該功能。

   oracle lob是用來存儲大量的二進制和文本數(shù)據(jù)的一種數(shù)據(jù)類型(一個lob字段可存儲可多達4gb的數(shù)據(jù))。目前,它又分為兩種類型:內(nèi)部lob和外部lob。內(nèi)部lob將數(shù)據(jù)以字節(jié)流的形式存儲在數(shù)據(jù)庫的內(nèi)部。因而,內(nèi)部lob的許多操作都可以參與事務,也可以像處理普通數(shù)據(jù)一樣對其進行備份和恢復操作。oracle8i支持三種類型的內(nèi)部lob:blob(二進制數(shù)據(jù))、clob(單字節(jié)字符數(shù)據(jù))、nclob(多字節(jié)國家字符數(shù)據(jù))。其中clob和nclob類型適用于存儲超長的文本數(shù)據(jù),blob字段適用于存儲大量的二進制數(shù)據(jù),如圖像、視頻、音頻等。目前,oracle8i只支持一種外部lob類型,即bfile類型。在數(shù)據(jù)庫內(nèi),該類型僅存儲數(shù)據(jù)在操作系統(tǒng)中的位置信息,而數(shù)據(jù)的實體以外部文件的形式存在于操作系統(tǒng)的文件系統(tǒng)中。因而,該類型所表示的數(shù)據(jù)是只讀的,不參與事務。該類型可幫助用戶管理大量的由外部程序訪問的文件。

  php oracle 8 函數(shù)分析

   php中有兩套oracle函數(shù)擴展庫,其中的oracle8函數(shù)允許訪問 oracle8 和 oracle7 數(shù)據(jù)庫,這些函數(shù)使用了oracle8 call-interface(oci8),支持向 oracle 位置標志符綁定局部和全局 php 變量,全面支持 lob、file 和 rowid,允許用戶使用用戶自定義的變量,即用戶數(shù)據(jù)庫的自定義對象類。

   oracle8函數(shù)庫中函數(shù)ocifetchinto用于取回一行數(shù)據(jù)記錄放入數(shù)組中,該函數(shù)的語法描述如下:

int ocifetchinto(array &result, int [mode])
   其中,參數(shù)mode可省略,內(nèi)定值為oci_num。在訪問oracle lob時,如果希望返回lob對象,則mode應設為oci_assoc+oci_return_lobs。

   函數(shù)ocibindbyname用于將php變量與oracle對象進行綁定,從而建立php與oracle之間的數(shù)據(jù)通訊,該函數(shù)語法描述為:

boolean ocibindbyname(int stmt, string ph_name, mixed &variable, int length, int [type])
   其中:參數(shù)stmt是經(jīng)過oracle解析函數(shù)ociparse解析后的字串指標。參數(shù)ph_name即需綁定的oracle返回變量名稱;參數(shù)variable前面一定要加&符號,表php變量地址。參數(shù)length為變量的長度,若設為-1則使用指定的variable變量的最大值;參數(shù)type可省略,其值有oci_b_file(二進制文件)、oci_b_cfile(文本文件)、oci_b_clob(文字lob)、oci_b_blob(位元lob)及oci_b_rowid(rowid)等數(shù)種。值得注意的是,如使用oracle8中特有的新數(shù)據(jù)類型lob/rowid/bfile時,需要先執(zhí)行 ocinewdescriptor()函數(shù),同時必須要將length參數(shù)設成 -1。

   函數(shù)ocinewdescriptor用于初始化新的lob/file描述。該函數(shù)語法描述為:

string ocinewdescriptor(int connection , int [type])
   其中的type同ocibindbyname函數(shù)中的type定義。

  必須的環(huán)境配置

   使用php的oracle8函數(shù)庫需要oracle8客戶端庫。在使用這個擴展之前,請確認你已經(jīng)為oracle 用戶和web daemon 用戶正確設置了 oracle 環(huán)境變量。下面列出了需要設置的環(huán)境變量:
  • oracle_home #oracle安裝路徑
  • oracle_sid # oracle數(shù)據(jù)庫id
  • ld_library_path #ld聯(lián)接庫路徑
  • nls_lang #oralce地區(qū)(語言)設置
  • ora_nls33 # ora_nls33路徑
  為linux環(huán)境下驗證以上變量是否正確,最佳的辦法就是分別在oracle用戶與nobody下執(zhí)行:

# env
   根據(jù)輸出的結(jié)果,判斷上述環(huán)境變量是否一致。

   在為web 服務器用戶設置環(huán)境變量之后,你還需要將web 服務器用戶(nobody、 www)加到oracle組中。

   有關oracle8客戶端和php安裝設置的詳細說明,請參考相關的技術(shù)手冊。

  應用范例

   在php中上載并將文件存儲在oracle lob字段中的應用范例如下:

//lob對象初始化,獲取php變量指針

$lob = ocinewdescriptor($conn, oci_d_lob);

//向有關的文件記錄表添加紀錄,oracle sql語法解釋

$stmt = ociparse($conn,"update t_file set filename='".$_files['fj1']['name'].
"',filetype='".$_files['f1']['type']."',files=empty_blob() where fileid=".$newid." returning files into :lob");

//綁定lob變量

ocibindbyname($stmt, ':lob', &$lob, -1, oci_b_blob);

ociexecute($stmt, oci_default);//執(zhí)行語句

if($lob->savefile($f1)){//將表單提交的文件通過lob指針存入oracle數(shù)據(jù)庫

ocicommit($conn);

//成功上傳

}else{

//未能成功上傳

}

ocifreedesc($lob);

ocifreestatement($stmt);

//結(jié)束
  在php中將文件從數(shù)據(jù)庫中提取并下載的應用范例如下:

$stmt = ociparse($conn,"select * from t_ file where fileid =$id");

ociexecute($stmt);

if(ocifetchinto($stmt,$result,oci_assoc+oci_return_lobs)){

//輸出文件類型信息供瀏覽器判斷

header("content-type: ".$result[filetype]);

//輸出文件名,瀏覽器可提示是否打開或下載該文件

header("content-disposition: attachment; filename=".$result[filename]);

//以上關于header函數(shù)的使用可參考php manual,html的文件頭信息請參考internet rfc 2616。

//輸出文件流,在此,瀏覽器獲取文件內(nèi)容,出現(xiàn)正在下載或直接打開文件的提示

echo $result[files];

}

ocifreestatement($stmt);

//結(jié)束

  以上范例僅是應用的關鍵語句,并在linux+php+apache+oracle8i平臺上通過了驗證,讀者可根據(jù)自身需要進行完善和補充。

  結(jié)束語

  本文探討php對oracle lob訪問的實現(xiàn),僅是php在b/s結(jié)構(gòu)系統(tǒng)中基本運用技術(shù)所涉及的一個方面。筆者曾對比了jdbc與php-oci兩者的執(zhí)行效率,以jdbc為訪問引擎的oas http server(http server為apache2.0)的響應速度要遜于建立在linux+aache+php-oci平臺之上的web server,這其中當然有l(wèi)inux的出色表現(xiàn),但不可否認的是,php與oci的組合是非常優(yōu)秀的。

  由于缺乏oracle lob與php oracle8函數(shù)庫相結(jié)合運用的嘗試,在開發(fā)信息管理系統(tǒng)中,為實現(xiàn)對大型數(shù)據(jù)文件的管理,php在此方面的功能并未得到有效的利用,希望本文對從事php數(shù)據(jù)庫技術(shù)卻遇到此方面難題的程序員會有所幫助。
  • 網(wǎng)站運營seo文章大全
  • 提供全面的站長運營經(jīng)驗及seo技術(shù)!
  • 發(fā)表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發(fā)表
    主站蜘蛛池模板: 四川省| 德州市| 甘肃省| 海兴县| 双牌县| 潮州市| 敦煌市| 徐闻县| 渑池县| 上饶县| 晋中市| 鄯善县| 嘉禾县| 扎兰屯市| 桐城市| 横峰县| 桓台县| 平南县| 汝州市| 河源市| 读书| 三江| 攀枝花市| 临潭县| 湾仔区| 新源县| 静乐县| 西宁市| 滁州市| 江川县| 姜堰市| 康马县| 白山市| 上林县| 定兴县| 盱眙县| 水富县| 邳州市| 临沧市| 西城区| 资阳市|