用php操纵oracle的lob类型的数据_第1页
用php操纵oracle的lob类型的数据_第2页
用php操纵oracle的lob类型的数据_第3页
用php操纵oracle的lob类型的数据_第4页
全文预览已结束

下载本文档

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

文档简介

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

2、BLOB和BFILE是用来存储二进制数据的。CLOB和BLOB的最大长度是4GB它们把值存放在 Oracle数据库中。BFILE和BLOB类似,但它把数据 放在外部的文件 中,所以它又称为外部 BLOB( External BLOB )。我们对MYSQ应该都不会陌生。MYSQL中也有类似的数据类型,如TEXT和BLOB在PHP的MYSQ函数中,对TEXT/BLOB的操作是直接的,就象其它类型的数据一样。但在Oracle中,情况就不一样了。Oracle把LOB当作一种特殊的数据类型来处理,在操作上不能用常规的方法。比如,不能在INSERT语句中直接 把值插入到LOB字段中,也不能用 LIKE进行

3、查找。下面就通过几个例子来说明如何用PHP的OCI函数来插入,取出和查询LOB数据。插入不能直接用INSERT语句向LOB字段中插入值。一般情况下,有如下的几步:1、先分析一个INSERT语句,返回一个 LOB的描述符2、用OCI函数生成一个本地的 LOB对象3、将LOB对象绑定到LOB描述符上4、执行INSERT语句5、给LOB对象赋值6、释放LOB对象和SQL语句句柄下面的这个例子是把用户上传的图片文件存放到BLOB(或BFILE中,操作稍有不同)中。首先要建一个表,结构如下:CREATE TABLE PICTURES (ID NUMBER,DESCRIPTION VARCHAR2(100

4、),MIME VARCHAR2(128),PICTURE BLOB);如果要实现ID的自动增加,再建一个 SEQUENCE:CREATE SEQUENCE PIC_SEQ;然后是用来处理数据的 PHP程序代码。v ?php/建立Oracle数据库连接$conn = OCILogo n( $user, $password, $SID);/提交SQL语句给 OracleII在这里要注意的两点:一是用EMPTY_BLOB函数。这是Oracle的内部函数,返回一个LOB的定位符。在插入 LOB时,只能用这个办法先生成一个空的LOB定 位符,然后对这个定位符进行操作。EMPTY_BLOB函数是针对BLO

5、B类型的,对应于CLOB的是EMPTY_CLOB。)二 是RETURNING面的部分,把 picture 返回,让 PHP的OCI函数能够处理。$stmt = OCIParse($co nn INSERT INTO PICTURES, descriptio n, picture) VALUES (pic_seq.NEXTVAL, $descripti on, $lob_upload_type, EMPTY_BLOB() RETURNING picture INTO :PICTURE);II生成一个本地LOB对象的描述符。注意函数的第二个参数:OCI_D_LOB表示生成一个LOB对象。其它可能的

6、还有 OCI_D_FILE和OCI_D_ROWID分别对应于 BFILE 和ROWID寸象。$lob = OCINewDescriptor($c onn, OCI_D_LOB);II将生成的LOB对象绑定到前面SQL语句返回的定位符上。OCIBindByName($stmt, PICTURE, &$lob, -1, OCI_B_BLOB);OCIExecute($stmt);II向LOB对象中存入数据。因为这里的源数据是一个文件,所以直接用LOB对象的savefile() 方法。LOB对象的其它方法还有:save()和load(),分别用来保存和取出数据。但BFILE类型只有一个方法就是 sa

7、ve()if($lob- savefile($lob_upload)OCICommit($co nn);echo 上传成功v br ; elseecho 上传失败v br ; /释放LOB对象OCIFreeDesc($lob);OCIFreeStateme nt($stmt); OCILogoff($co nn);?还有一个要注意的地方:LOB字段的值最少要 1个字符,所以在 save()或savefile()之前,要确保值不能为空。否则Oracle会出错。取出对一个LOB中取出数据,有两种办法。一是生成一个LOB对象,然后绑定到一条SELECT 语句返回的定位符上,再用LOB对象的load(

8、)方法取出数据;二是直接用PHP的OCIFetch*函数。第一种方法比第二种方法要麻烦得多,所以我直接说说第二种方法。还是用上面的表。v ?php$conn = OCILogo n( $user, $password, $SID);$stmt = OCIParse($co nn,”SELECT * FROM PICTURES WHERE ID=$pictureid); OCIExecute($stmt);/秘密就在PCIFetchInfo 的第三个参数上:OCI_RETURN_LOBS第三个参数是FETCH的模式,如果 OCI_RETURN_LOBS就直接把LOB的值放到结果数组中,而不是LO

9、B定位符,也就不用 LOB对象的load()方法了。if (OCIFetchI nto($stmt, $result, OCI_ASSOC+OCI_RETURN_LOBS)echo Co nten t-type: . StripSlashes($resultMIME);echo StripSlashes($resultPICTURE);OCIFreeStateme nt($stmt);OCILogoff($co nn);?这个程序用来显示放在LOB中的数据(图片)。调用方法(假设脚本名是getpicture.php ):v IMG SRC=getpicture.php?pictureid=99

10、 ALT= 放在 Oracle LOB 中的图片” 查询前面已经提了下, 对于Oracle的LOB字段是不能用LIKE进行匹配的。怎么办呢?其实 并不复杂,Oracle有一个匿名的程序包, 叫DBMS_LO,B里面有所有的操作 LOB所需的过程。假设有象这样一个表:CREATE TABLE ARTICLES (ID NUMBER,TITLE VARCHAR2(100),CONTENT CLOB);文章的内容放在 CONTEN字段中。现在我们要找出所以内容中包含PHP中文用户”的文章,可以这么来做:v ?php$conn = OCILogo n( $user, $password, $SID);/WHERE子句中用了 DBMS_LOB.INST过程。它有四个参数,前面两个分别表示 LOB的定位符(可以直接用字段表示)和要查找的字符串;后面两个分别表示开始 的偏移量和出现的次数。要注意的是必须判断它的返回值,也就是要大于0。$stmt = OCIParse($co nn,”SELECT * FROM ARTICLES WHEREDBMS_LOBNSTR(CONTENT, PHI中文用户,1, 1) 0);OCIExecute($stmt);if (OCIFetchI nto($stmt, $result, OCI_ASSOC+OCI_RETURN_LOBS)OCIFreeState

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论