下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、用 PHP 操縱 Oracle 的 LOB 類型的數(shù)據(jù)用過 Oracle 的人都知道, Oracle 有一種數(shù)據(jù)類型叫 VARCHAR2 ,用來表示不定長(zhǎng)的字符 串。 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 的最大長(zhǎng)度是 4GB ,它們把值存放在 Oracle 數(shù)據(jù)庫中。 BFILE 和 BLOB 類似,但它把數(shù)據(jù) 放在外部的文件中,所以它又稱為外部 BLOB(ExternalBLOB )。我們對(duì)MYSQL應(yīng)該都不會(huì)陌生。 MYSQL中也有類似的數(shù)據(jù)類型,如TEXT和BLOB。在PHP 的 MYSQL 函數(shù)中,對(duì) 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 對(duì)象3、將 LOB 對(duì)象綁定到 LOB 描述符上4、執(zhí)行 INSERT 語句5、給LOB對(duì)象賦值6、釋放LOB對(duì)象和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定位符,然后對(duì)這個(gè)定位符進(jìn)行操作。EMPTY_BLOB()函數(shù)是針對(duì) BLO
5、B類型的,對(duì)應(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對(duì)象的描述符。注意函數(shù)的第二個(gè)參數(shù):OCI
6、_D_LOB,表示生成一個(gè)LOB對(duì)象。其它可能的還有 OCI_D_FILE和OCI_D_ROWID,分別對(duì)應(yīng)于 BFILE和ROWID 對(duì)象。$lob=OCINewDescriptor($co nn,O CI_D_LOB);/將生成的LOB對(duì)象綁定到前面 SQL語句返回的定位符上。OCIBi ndByName($stmt,':PICTURE', &$lob,-1,OCI_B_BLOB);OCIExecute($stmt);/向LOB對(duì)象中存入數(shù)據(jù)。因?yàn)檫@里的源數(shù)據(jù)是一個(gè)文件,所以直接用LOB對(duì)象的savefile()方法。LOB對(duì)象的其它方法還有:save()和load
7、(),分別用來保存和取出數(shù)據(jù)。但BFILE類型只有一個(gè)方法就是 save()if($lob- > savefile($lob_upload)OCICommit($co nn);echo"上傳成功v br >"elseecho"上傳失敗v br >"II釋放LOB對(duì)象OCIFreeDesc($lob);OCIFreeStateme nt($stmt);OCILogoff($co nn);?>還有一個(gè)要注意的地方:LOB字段的值最少要 1個(gè)字符,所以在 save()或savefile()之前,要確保值不能為空。否則Oracle會(huì)出錯(cuò)。
8、取出對(duì)一個(gè)LOB中取出數(shù)據(jù),有兩種辦法。一是生成一個(gè)LOB對(duì)象,然后綁定到一條 SELECT 語句返回的定位符上,再用LOB對(duì)象的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對(duì)象的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)提了下,對(duì)于 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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版辦公家具展會(huì)租賃與銷售合作合同3篇
- 二零二五年度武漢東湖風(fēng)景區(qū)旅游開發(fā)合同3篇
- 二零二五年度藝術(shù)品共同創(chuàng)作與展覽合同2篇
- 二零二五版房屋租賃合同免責(zé)及維修保障3篇
- 二零二五版燈光照明工程設(shè)計(jì)咨詢合同2篇
- 二零二五版班組分包消防設(shè)施分包服務(wù)合同樣本3篇
- 二零二五版新媒體行業(yè)勞動(dòng)合同制度及知識(shí)產(chǎn)權(quán)保護(hù)協(xié)議2篇
- 二零二五年空調(diào)銷售與綠色消費(fèi)倡導(dǎo)合同3篇
- 二零二五年度鋼管模板租賃環(huán)保要求及價(jià)格評(píng)估合同3篇
- 二零二五版網(wǎng)絡(luò)安全威脅情報(bào)共享與預(yù)警服務(wù)合同范本3篇
- 2024年安徽省合肥市瑤海區(qū)中考語文一模試卷
- 單位車輛變更名稱的委托書
- 粉塵外協(xié)單位清理協(xié)議書
- 2023年12月首都醫(yī)科大學(xué)附屬北京中醫(yī)醫(yī)院面向應(yīng)屆生招考聘用筆試近6年高頻考題難、易錯(cuò)點(diǎn)薈萃答案帶詳解附后
- 茶室經(jīng)營(yíng)方案
- 軍隊(duì)文職崗位述職報(bào)告
- 小學(xué)數(shù)學(xué)六年級(jí)解方程練習(xí)300題及答案
- 電抗器噪聲控制與減振技術(shù)
- 中醫(yī)健康宣教手冊(cè)
- 2024年江蘇揚(yáng)州市高郵市國(guó)有企業(yè)招聘筆試參考題庫附帶答案詳解
- 消費(fèi)醫(yī)療行業(yè)報(bào)告
評(píng)論
0/150
提交評(píng)論