



下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、.:.;用PHP支配Oracle的LOB类型的数据用过Oracle的人都知道,Oracle有一种数据类型叫VARCHAR2,用来表示不定长的字符串。VARCHAR2也是Oracle公司引荐运用的 类型。但运用VARCHAR2有个问题:最大只能表示4000个字符,也就相当于2000个汉字。假设他的程序中某个字符的值要大于20002个汉字,用 VARCHAR2就不能满足要求了。这时候,他有两个选择,一是用多个VARCHAR2来表示,二是用LOB字段。这里我们来看看第二个方法。 先来大体了解一下Oracle的LOB字段。Oracle的LOB类型分为三种:BLOB,CLOB和BFILE。CLOB称为字
2、符LOB,BLOB和 BFILE是用来存储二进制数据的。CLOB和BLOB的最大长度是4GB,它们把值存放在Oracle数据库中。BFILE和BLOB类似,但它把数据 放在外部的文件中,所以它又称为外部BLOBExternal BLOB。 我们对MYSQL应该都不会陌生。 MYSQL中也有类似的数据类型,如TEXT和BLOB。在PHP的MYSQL函数中,对TEXT/BLOB的操作是直接的,就象其它类型的数据一样。但 在Oracle中,情况就不一样了。Oracle把LOB当作一种特殊的数据类型来处置,在操作上不能用常规的方法。比如,不能在INSERT语句中直接 把值插入到LOB字段中,也不能用L
3、IKE进展查找。 下面就经过几个例子来阐明如何用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, DESCRIPTIO
4、N VARCHAR2(100), MIME VARCHAR2(128), PICTURE BLOB ); 假设要实现ID的自动添加,再建一个SEQUENCE: CREATE SEQUENCE PIC_SEQ; 然后是用来处置数据的PHP程序代码。 ?php /建立Oracle数据库衔接 $conn = OCILogon($user, $password, $SID); /提交SQL语句给Oracle / 在这里要留意的两点:一是用EMPTY_BLOB()函数。这是Oracle的内部函数,前往一个LOB的定位符。在插入LOB时,只能用这个方法先生成 一个空的LOB定位符,然后对这个定位符进展操作
5、。EMPTY_BLOB()函数是针对BLOB类型的,对应于CLOB的是EMPTY_CLOB()。二 是RETURNING后面的部分,把picture前往,让PHP的OCI函数可以处置。 $stmt = OCIParse($conn,INSERT INTO PICTURES (id, description, picture) VALUES (pic_seq.NEXTVAL, $description, $lob_upload_type, EMPTY_BLOB() RETURNING picture INTO :PICTURE); /生成一个本地LOB对象的描画符。留意函数的第二个参数:OCI_
6、D_LOB,表示生成一个LOB对象。其它能够的还有OCI_D_FILE和OCI_D_ROWID,分别对应于BFILE和ROWID对象。 $lob = OCINewDescriptor($conn, OCI_D_LOB); /将生成的LOB对象绑定到前面SQL语句前往的定位符上。 OCIBindByName($stmt, :PICTURE, &$lob, -1, OCI_B_BLOB); OCIExecute($stmt); /向LOB对象中存入数据。由于这里的源数据是一个文件,所以直接用LOB对象的savefile()方法。LOB对象的其它方法还有:save()和load(),分别用来保管和取
7、出数据。但BFILE类型只需一个方法就是save() if($lob-savefile($lob_upload) OCICommit($conn); echo 上传胜利br; else echo 上传失败br; /释放LOB对象 OCIFreeDesc($lob); OCIFreeStatement($stmt); OCILogoff($conn); ? 还有一个要留意的地方:LOB字段的值最少要1个字符,所以在save()或savefile()之前,要确保值不能为空。否那么,Oracle会出错。取出 对一个LOB中取出数据,有两种方法。一是生成一个LOB对象,然后绑定到一条SELECT语句前
8、往的定位符 上,再用LOB对象的load()方法取出数据;二是直接用PHP的OCIFetch*函数。第一种方法比第二种方法要费事得多,所以我直接说说第二 种方法。 还是用上面的表。 ?php $conn = OCILogon($user, $password, $SID); $stmt = OCIParse($conn,SELECT * FROM PICTURES WHERE ID=$pictureid); OCIExecute($stmt); /就在PCIFetchInfo的第三个参数上:OCI_RETURN_LOBS。第三个参数是FETCH的方式,假设OCI_RETURN_LOBS,就直接
9、把LOB的值放到结果数组中,而不是LOB定位符,也就不用LOB对象的load()方法了。 if (OCIFetchInto($stmt, $result, OCI_ASSOC+OCI_RETURN_LOBS) echo Content-type: . StripSlashes($resultMIME); echo StripSlashes($resultPICTURE); OCIFreeStatement($stmt); OCILogoff($conn); ? 这个程序用来显示放在LOB中的数据图片。调用方法假设脚本名是getpicture.php: IMG SRC=getpicture.ph
10、p?pictureid=99 ALT=放在Oracle LOB中的图片 查询 前面曾经提了下,对于Oracle的LOB字段是不能用LIKE进展匹配的。怎样办呢?其实并不复杂,Oracle有一个匿名的程序包,叫DBMS_LOB,里面有一切的操作LOB所需的过程。 假设有象这样一个表: CREATE TABLE ARTICLES ( ID NUMBER, TITLE VARCHAR2(100), CONTENT CLOB ); 文章的内容放在CONTENT字段中。 如今我们要找出所以内容中包含PHP中文用户的文章,可以这么来做: ?php $conn = OCILogon($user, $pass
11、word, $SID); /WHERE子句中用了DBMS_LOB.INSTR过程。它有四个参数,前面两个分别表示LOB的定位符可以直接用字段表示和要查找的字符串;后面两个分别表示开场的偏移量和出现的次数。要留意的是必需判别它的前往值,也就是要大于0。 $stmt = OCIParse($conn,SELECT * FROM ARTICLES WHERE DBMS_LOB.INSTR(CONTENT, PHP中文用户, 1, 1) 0); OCIExecute($stmt); if (OCIFetchInto($stmt, $result, OCI_ASSOC+OCI_RETURN_LOBS) . OCIFreeSta
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 在线教育平台内容制作手册
- 房屋买卖合同居间协议
- 工程管理质量与安全控制手册
- 家具厂厂长聘任书合同
- 地皮交易居间协议合同
- 2025年绵阳货运从业资格证考试题库
- 《数据可视化技术应用》3.3 构建销售数据动态分析看板-教案
- 员工上下班安全协议书5篇
- 厂房消防劳务承包合同范例
- 淮北房产合同范本
- 2025年黑龙江农业经济职业学院单招职业倾向性测试题库参考答案
- 2025年广东省深圳法院招聘书记员招聘144人历年高频重点模拟试卷提升(共500题附带答案详解)
- 变电站电网侧储能项目可行性研究报告
- 4.2 同学相伴 第二课时 课件 2024-2025学年三年级下册道德与法治 统编版
- 2025年全球及中国调频储能行业头部企业市场占有率及排名调研报告
- 2025年度会计人员继续教育会计法律法规答题活动测试100题答案
- 消防维保年度工作计划
- 枣庄学院《电力拖动与自动控制系统》2023-2024学年第一学期期末试卷
- 2024年江苏经贸职业技术学院单招职业适应性测试题库
- 绿化迁移专项施工方案
- 2025届高三化学一轮复习 原电池 化学电源(第一课时)课件
评论
0/150
提交评论