用PHP操縱rcle的LB類型的數(shù)據(jù)_第1頁
用PHP操縱rcle的LB類型的數(shù)據(jù)_第2頁
用PHP操縱rcle的LB類型的數(shù)據(jù)_第3頁
用PHP操縱rcle的LB類型的數(shù)據(jù)_第4頁
用PHP操縱rcle的LB類型的數(shù)據(jù)_第5頁
免費預覽已結(jié)束,剩余1頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、用 PHP 操縱 Oracle 的 LOB 類型的數(shù)據(jù)用過 Oracle 的人都知道, Oracle 有一種數(shù)據(jù)類型叫 VARCHAR2 ,用來表示不定長的字符 串。 VARCHAR2 也是 Oracle 公司推薦使用的類型。但使用 VARCHAR2 有個問題:最大 只能表示 4000 個字符,也就相當于 2000 個漢字。如果你的程序中某個字符的值要大于 20002 個漢字,用 VARCHAR2 就不能滿足要求了。這時候,你有兩個選擇,一是用多個 VARCHAR2 來表示,二是用 LOB 字段。這里我們來看看第二個辦法。先來大體了解一下 Oracle 的 LOB 字段。 Oracle 的 L

2、OB 類型分為三種: BLOB,CLOB 和BFILE。CLOB稱為字符LOB , BLOB和BFILE是用來存儲二進制數(shù)據(jù)的。 CLOB和BLOB 的最大長度是 4GB ,它們把值存放在 Oracle 數(shù)據(jù)庫中。 BFILE 和 BLOB 類似,但它把數(shù)據(jù) 放在外部的文件中,所以它又稱為外部 BLOB(ExternalBLOB )。我們對MYSQL應該都不會陌生。 MYSQL中也有類似的數(shù)據(jù)類型,如TEXT和BLOB。在PHP 的 MYSQL 函數(shù)中,對 TEXT/BLOB 的操作是直接的,就象其它類型的數(shù)據(jù)一樣。但 在 Oracle 中,情況就不一樣了。 Oracle 把 LOB 當作一種

3、特殊的數(shù)據(jù)類型來處理,在操作 上不能用常規(guī)的方法。比如,不能在 INSERT 語句中直接把值插入到 LOB 字段中,也不能 用 LIKE 進行查找。下面就通過幾個例子來說明如何用 PHP 的 OCI 函數(shù)來插入,取出和查詢 LOB 數(shù)據(jù)。插入不能直接用 INSERT 語句向 LOB 字段中插入值。一般情況下,有如下的幾步:1、先分析一個 INSERT 語句,返回一個 LOB 的描述符2、用 OCI 函數(shù)生成一個本地的 LOB 對象3、將 LOB 對象綁定到 LOB 描述符上4、執(zhí)行 INSERT 語句5、給LOB對象賦值6、釋放LOB對象和SQL語句句柄BLOB (或BFILE中,操作稍有不同

4、)下面的這個例子是把用戶上傳的圖片文件存放到中。首先要建一個表,結(jié)構(gòu)如下:如果要實現(xiàn)ID的自動增加,再建一個 SEQUENCE:CREATESEQUENCEPIC_SEQ;然后是用來處理數(shù)據(jù)的 PHP程序代碼。v ?php/建立Oracle數(shù)據(jù)庫連接$co nn=OCILogo n($user,$password,$SID);/提交SQL語句給 Oracle/在這里要注意的兩點:一是用EMPTY_BLOB()函數(shù)。這是 Oracle的內(nèi)部函數(shù),返回一個LOB的定位符。在插入 LOB時,只能用這個辦法先生成一個空的LOB定位符,然后對這個定位符進行操作。EMPTY_BLOB()函數(shù)是針對 BLO

5、B類型的,對應于 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");/生成一個本地LOB對象的描述符。注意函數(shù)的第二個參數(shù):OCI

6、_D_LOB,表示生成一個LOB對象。其它可能的還有 OCI_D_FILE和OCI_D_ROWID,分別對應于 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ù)。因為這里的源數(shù)據(jù)是一個文件,所以直接用LOB對象的savefile()方法。LOB對象的其它方法還有:save()和load

7、(),分別用來保存和取出數(shù)據(jù)。但BFILE類型只有一個方法就是 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);?>還有一個要注意的地方:LOB字段的值最少要 1個字符,所以在 save()或savefile()之前,要確保值不能為空。否則Oracle會出錯。

8、取出對一個LOB中取出數(shù)據(jù),有兩種辦法。一是生成一個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 的第三個參數(shù)上:OCI_RET

9、URN_LOBS。第三個參數(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);這個程序用來顯示放在 LOB中的數(shù)據(jù)(圖片)。調(diào)用方法(假設腳本名是ge

10、tpicture.php ):放在OracleLOB 中的圖片”v IMGSRC="getpicture.php?pictureid=99"ALT="查詢前面已經(jīng)提了下,對于 Oracle的LOB字段是不能用LIKE進行匹配的。怎么辦呢?其 實并不復雜,Oracle有一個匿名的程序包,叫 DBMS_LOB,里面有所有的操作 LOB所需 的過程。假設有象這樣一個表文章的內(nèi)容放在 CONTENT字段中?,F(xiàn)在我們要找出所以內(nèi)容中包含 "PHP中文用戶”的文章,可以這么來做:v ?php$co nn=OCILogo n($user,$password,$SID)

11、;/WHERE 子句中用了 DBMS_LOBNSTR 過程。它有四個參數(shù), 前面兩個分別表示 LOB的定位符(可以直接用字段表示)和要查找的字符串;后面兩個分別表示開始的偏移量和出現(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)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論