




下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、用 PHP 操縱 Oracle 的 LOB 類型的數(shù)據(jù)用過 Oracle 的人都知道, Oracle 有一種數(shù)據(jù)類型叫 VARCHAR2 ,用來表示不定長的字符 串。 VARCHAR2 也是 Oracle 公司推薦使用的類型。但使用 VARCHAR2 有個(gè)問題:最大 只能表示 4000 個(gè)字符,也就相當(dāng)于 2000 個(gè)漢字。如果你的程序中某個(gè)字符的值要大于 20002 個(gè)漢字,用 VARCHAR2 就不能滿足要求了。這時(shí)候,你有兩個(gè)選擇,一是用多個(gè) VARCHAR2 來表示,二是用 LOB 字段。這里我們來看看第二個(gè)辦法。先來大體了解一下 Oracle 的 LOB 字段。 Oracle 的 L
2、OB 類型分為三種: BLOB,CLOB 和BFILE。CLOB稱為字符LOB , BLOB和BFILE是用來存儲(chǔ)二進(jìn)制數(shù)據(jù)的。 CLOB和BLOB 的最大長度是 4GB ,它們把值存放在 Oracle 數(shù)據(jù)庫中。 BFILE 和 BLOB 類似,但它把數(shù)據(jù) 放在外部的文件中,所以它又稱為外部 BLOB(ExternalBLOB )。我們對MYSQL應(yīng)該都不會(huì)陌生。 MYSQL中也有類似的數(shù)據(jù)類型,如TEXT和BLOB。在PHP 的 MYSQL 函數(shù)中,對 TEXT/BLOB 的操作是直接的,就象其它類型的數(shù)據(jù)一樣。但 在 Oracle 中,情況就不一樣了。 Oracle 把 LOB 當(dāng)作一種
3、特殊的數(shù)據(jù)類型來處理,在操作 上不能用常規(guī)的方法。比如,不能在 INSERT 語句中直接把值插入到 LOB 字段中,也不能 用 LIKE 進(jìn)行查找。下面就通過幾個(gè)例子來說明如何用 PHP 的 OCI 函數(shù)來插入,取出和查詢 LOB 數(shù)據(jù)。插入不能直接用 INSERT 語句向 LOB 字段中插入值。一般情況下,有如下的幾步:1、先分析一個(gè) INSERT 語句,返回一個(gè) LOB 的描述符2、用 OCI 函數(shù)生成一個(gè)本地的 LOB 對象3、將 LOB 對象綁定到 LOB 描述符上4、執(zhí)行 INSERT 語句5、給LOB對象賦值6、釋放LOB對象和SQL語句句柄BLOB (或BFILE中,操作稍有不同
4、)下面的這個(gè)例子是把用戶上傳的圖片文件存放到中。首先要建一個(gè)表,結(jié)構(gòu)如下:如果要實(shí)現(xiàn)ID的自動(dòng)增加,再建一個(gè) SEQUENCE:CREATESEQUENCEPIC_SEQ;然后是用來處理數(shù)據(jù)的 PHP程序代碼。v ?php/建立Oracle數(shù)據(jù)庫連接$co nn=OCILogo n($user,$password,$SID);/提交SQL語句給 Oracle/在這里要注意的兩點(diǎn):一是用EMPTY_BLOB()函數(shù)。這是 Oracle的內(nèi)部函數(shù),返回一個(gè)LOB的定位符。在插入 LOB時(shí),只能用這個(gè)辦法先生成一個(gè)空的LOB定位符,然后對這個(gè)定位符進(jìn)行操作。EMPTY_BLOB()函數(shù)是針對 BLO
5、B類型的,對應(yīng)于 CLOB的是EMPTY_CLOB()。二是RETURNING 后面的部分,把picture 返回,讓PHP的OCI函數(shù)能 夠處理。$stmt=OCIParse($co nn ,"INSERTINTOPICTURES(id,descriptio n,picture)VALUES(pic_seq.NEXTVAL,'$descriptio n','$lob_upload_type',EMPTY_BLOB()RETUR NINGpicturelNTO:PICTURE");/生成一個(gè)本地LOB對象的描述符。注意函數(shù)的第二個(gè)參數(shù):OCI
6、_D_LOB,表示生成一個(gè)LOB對象。其它可能的還有 OCI_D_FILE和OCI_D_ROWID,分別對應(yīng)于 BFILE和ROWID 對象。$lob=OCINewDescriptor($co nn,O CI_D_LOB);/將生成的LOB對象綁定到前面 SQL語句返回的定位符上。OCIBi ndByName($stmt,':PICTURE', &$lob,-1,OCI_B_BLOB);OCIExecute($stmt);/向LOB對象中存入數(shù)據(jù)。因?yàn)檫@里的源數(shù)據(jù)是一個(gè)文件,所以直接用LOB對象的savefile()方法。LOB對象的其它方法還有:save()和load
7、(),分別用來保存和取出數(shù)據(jù)。但BFILE類型只有一個(gè)方法就是 save()if($lob- > savefile($lob_upload)OCICommit($co nn);echo"上傳成功v br >"elseecho"上傳失敗v br >"II釋放LOB對象OCIFreeDesc($lob);OCIFreeStateme nt($stmt);OCILogoff($co nn);?>還有一個(gè)要注意的地方:LOB字段的值最少要 1個(gè)字符,所以在 save()或savefile()之前,要確保值不能為空。否則Oracle會(huì)出錯(cuò)。
8、取出對一個(gè)LOB中取出數(shù)據(jù),有兩種辦法。一是生成一個(gè)LOB對象,然后綁定到一條 SELECT 語句返回的定位符上,再用LOB對象的load()方法取出數(shù)據(jù);二是直接用PHP的OCIFetch*函數(shù)。第一種方法比第二種方法要麻煩得多,所以我直接說說第二種方法。還是用上面的表。v ?php$conn=OCILogo n($user,$password,$SID);$stmt=OCIParse($co nn,”SELECT*FROMPICTURESWHEREID=$pictureid");OCIExecute($stmt);/秘密就在PCIFetchInfo 的第三個(gè)參數(shù)上:OCI_RET
9、URN_LOBS。第三個(gè)參數(shù)是FETCH的模式,如果 OCI_RETURN_LOBS,就直接把LOB的值放到結(jié)果數(shù)組中,而不是LOB定位符,也就不用 LOB對象的load()方法了。if(OCIFetchI nto($stmt,$result,OCI_ASSOC+OCI_RETURN_LOBS)echo"Co nte nt-type:".StripSlashes($resultMIME);echoStripSlashes($resultPICTURE);OCIFreeStateme nt($stmt);這個(gè)程序用來顯示放在 LOB中的數(shù)據(jù)(圖片)。調(diào)用方法(假設(shè)腳本名是ge
10、tpicture.php ):放在OracleLOB 中的圖片”v IMGSRC="getpicture.php?pictureid=99"ALT="查詢前面已經(jīng)提了下,對于 Oracle的LOB字段是不能用LIKE進(jìn)行匹配的。怎么辦呢?其 實(shí)并不復(fù)雜,Oracle有一個(gè)匿名的程序包,叫 DBMS_LOB,里面有所有的操作 LOB所需 的過程。假設(shè)有象這樣一個(gè)表文章的內(nèi)容放在 CONTENT字段中。現(xiàn)在我們要找出所以內(nèi)容中包含 "PHP中文用戶”的文章,可以這么來做:v ?php$co nn=OCILogo n($user,$password,$SID)
11、;/WHERE 子句中用了 DBMS_LOBNSTR 過程。它有四個(gè)參數(shù), 前面兩個(gè)分別表示 LOB的定位符(可以直接用字段表示)和要查找的字符串;后面兩個(gè)分別表示開始的偏移量和出現(xiàn)的次數(shù)。要注意的是必須判斷它的返回值,也就是要大于0。$stmt=OCIParse($co nn,”SELECT*FROMARTICLESWHEREDBMS_LOB.INSTR(CONTENT,'PHP 中文用戶',1,1) > 0");OCIExecute($stmt);if(OCIFetchl nto($stmt,$result,OCI_ASSOC+OCI_RETURN_LOBS)OCIFreeStateme
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 圖書質(zhì)檢部管理制度
- 場站工程部管理制度
- 多媒體中心管理制度
- 外賣車租賃管理制度
- 外貿(mào)員倉庫管理制度
- 夜市攤團(tuán)隊(duì)管理制度
- 大單位鑰匙管理制度
- 大學(xué)志愿部管理制度
- 大數(shù)據(jù)租戶管理制度
- 大藥房日常管理制度
- 變電工程施工合同協(xié)議書
- 電工技術(shù)-北京科技大學(xué)中國大學(xué)mooc課后章節(jié)答案期末考試題庫2023年
- 星海音樂學(xué)院樂理試題A卷
- 2019年4月27日山東省紀(jì)委監(jiān)委遴選公務(wù)員考試真題及答案
- ktv包房服務(wù)員崗位職責(zé)8篇
- 西安某大跨度鋼桁架人行天橋結(jié)構(gòu)設(shè)計(jì)分析
- 新疆全部及全國部分加氣站分布情況6
- 初中學(xué)段勞動(dòng)任務(wù)清單(七到九年級(jí))
- 2023年中國各地磁偏角
- 六維領(lǐng)導(dǎo)力專題知識(shí)
- 【護(hù)士資格考試】云南省精神病醫(yī)院模擬檢測練習(xí)題
評(píng)論
0/150
提交評(píng)論