用PHP操纵rcle的LB类型的数据_第1页
用PHP操纵rcle的LB类型的数据_第2页
用PHP操纵rcle的LB类型的数据_第3页
用PHP操纵rcle的LB类型的数据_第4页
用PHP操纵rcle的LB类型的数据_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、用 PHP 操纵 Oracle 的 LOB 类型的数据用过 Oracle 的人都知道, Oracle 有一种数据类型叫 VARCHAR2 ,用来表示不定长的字符 串。 VARCHAR2 也是 Oracle 公司推荐使用的类型。但使用 VARCHAR2 有个问题:最大 只能表示 4000 个字符,也就相当于 2000 个汉字。如果你的程序中某个字符的值要大于 20002 个汉字,用 VARCHAR2 就不能满足要求了。这时候,你有两个选择,一是用多个 VARCHAR2 来表示,二是用 LOB 字段。这里我们来看看第二个办法。先来大体了解一下 Oracle 的 LOB 字段。 Oracle 的 L

2、OB 类型分为三种: BLOB,CLOB 和BFILE。CLOB称为字符LOB , BLOB和BFILE是用来存储二进制数据的。 CLOB和BLOB 的最大长度是 4GB ,它们把值存放在 Oracle 数据库中。 BFILE 和 BLOB 类似,但它把数据 放在外部的文件中,所以它又称为外部 BLOB(ExternalBLOB )。我们对MYSQL应该都不会陌生。 MYSQL中也有类似的数据类型,如TEXT和BLOB。在PHP 的 MYSQL 函数中,对 TEXT/BLOB 的操作是直接的,就象其它类型的数据一样。但 在 Oracle 中,情况就不一样了。 Oracle 把 LOB 当作一种

3、特殊的数据类型来处理,在操作 上不能用常规的方法。比如,不能在 INSERT 语句中直接把值插入到 LOB 字段中,也不能 用 LIKE 进行查找。下面就通过几个例子来说明如何用 PHP 的 OCI 函数来插入,取出和查询 LOB 数据。插入不能直接用 INSERT 语句向 LOB 字段中插入值。一般情况下,有如下的几步:1、先分析一个 INSERT 语句,返回一个 LOB 的描述符2、用 OCI 函数生成一个本地的 LOB 对象3、将 LOB 对象绑定到 LOB 描述符上4、执行 INSERT 语句5、给LOB对象赋值6、释放LOB对象和SQL语句句柄BLOB (或BFILE中,操作稍有不同

4、)下面的这个例子是把用户上传的图片文件存放到中。首先要建一个表,结构如下:如果要实现ID的自动增加,再建一个 SEQUENCE:CREATESEQUENCEPIC_SEQ;然后是用来处理数据的 PHP程序代码。v ?php/建立Oracle数据库连接$co nn=OCILogo n($user,$password,$SID);/提交SQL语句给 Oracle/在这里要注意的两点:一是用EMPTY_BLOB()函数。这是 Oracle的内部函数,返回一个LOB的定位符。在插入 LOB时,只能用这个办法先生成一个空的LOB定位符,然后对这个定位符进行操作。EMPTY_BLOB()函数是针对 BLO

5、B类型的,对应于 CLOB的是EMPTY_CLOB()。二是RETURNING 后面的部分,把picture 返回,让PHP的OCI函数能 够处理。$stmt=OCIParse($co nn ,"INSERTINTOPICTURES(id,descriptio n,picture)VALUES(pic_seq.NEXTVAL,'$descriptio n','$lob_upload_type',EMPTY_BLOB()RETUR NINGpicturelNTO:PICTURE");/生成一个本地LOB对象的描述符。注意函数的第二个参数: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对象中存入数据。因为这里的源数据是一个文件,所以直接用LOB对象的savefile()方法。LOB对象的其它方法还有:save()和load

7、(),分别用来保存和取出数据。但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中取出数据,有两种办法。一是生成一个LOB对象,然后绑定到一条 SELECT 语句返回的定位符上,再用LOB对象的load()方法取出数据;二是直接用PHP的OCIFetch*函数。第一种方法比第二种方法要麻烦得多,所以我直接说说第二种方法。还是用上面的表。v ?php$conn=OCILogo n($user,$password,$SID);$stmt=OCIParse($co nn,”SELECT*FROMPICTURESWHEREID=$pictureid");OCIExecute($stmt);/秘密就在PCIFetchInfo 的第三个参数上:OCI_RET

9、URN_LOBS。第三个参数是FETCH的模式,如果 OCI_RETURN_LOBS,就直接把LOB的值放到结果数组中,而不是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中的数据(图片)。调用方法(假设脚本名是ge

10、tpicture.php ):放在OracleLOB 中的图片”v IMGSRC="getpicture.php?pictureid=99"ALT="查询前面已经提了下,对于 Oracle的LOB字段是不能用LIKE进行匹配的。怎么办呢?其 实并不复杂,Oracle有一个匿名的程序包,叫 DBMS_LOB,里面有所有的操作 LOB所需 的过程。假设有象这样一个表文章的内容放在 CONTENT字段中。现在我们要找出所以内容中包含 "PHP中文用户”的文章,可以这么来做:v ?php$co nn=OCILogo n($user,$password,$SID)

11、;/WHERE 子句中用了 DBMS_LOBNSTR 过程。它有四个参数, 前面两个分别表示 LOB的定位符(可以直接用字段表示)和要查找的字符串;后面两个分别表示开始的偏移量和出现的次数。要注意的是必须判断它的返回值,也就是要大于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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论