dedecms织梦内容管理系统    
首页 | java | C/C++ | PHP | 操作系统 | ajax | 脚本编程 | 安全技术 | 本站下载页 | flex | CRM | 专题 | QQ群 | 测试中心 | 会员中心 | 积分规则
  当前位置:主页>PHP>php技术资料>文章内容
用PHP操纵Oracle的LOB类型的数据
来源:IBM     作者:    
  用过Oracle的人都知道,Oracle有一种数据类型叫VARCHAR2,用来表示不定长的字符串。VARCHAR2也是公司推荐使用的类型。但使用VARCHAR2有个问题:最大只能表示4000个字符,也就相当于2000个汉字。如果你的程序中某个字符的值要大于20002个汉字,用VARCHAR2就不能满足要求了。这时候,你有两个选择,一是用多个VARCHAR2来表示,二是用LOB字段。这里我们来看看第二个办法。

  先来大体了解一下Oracle的LOB字段。Oracle的LOB类型分为三种:BLOB,CLOB和BFILE。CLOB称为字符LOB,BLOB和BFILE是用来存储二进制数据的。CLOB和BLOB的最大长度是4GB,它们把值存放在中。BFILE和BLOB类似,但它把数据放在外部的文件中,所以它又称为外部BLOB(External BLOB)。

  我想,我们对MYSQL应该都不会陌生。中也有类似的数据类型,如TEXT和BLOB。在的中,对TEXT/BLOB的操作是直接的,就象其它类型的数据一样。但在Oracle中,情况就不一样了。把LOB当作一种特殊的数据类型来处理,在操作上不能用常规的方法。比如,不能在INSERT语句中直接把值插入到LOB字段中,也不能用LIKE进行查找。

  下面就通过几个例子来说明如何用的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),
MIME VARCHAR2(128),
PICTURE BLOB
);

  如果要实现ID的自动增加,再建一个SEQUENCE:

CREATE SEQUENCE PIC_SEQ;

  然后是用来处理数据的程序代码。

<?

 //建立连接

 $conn = OCILogon($user, $password, $SID);

 //提交SQL语句给
 //在这里要注意的两点:一是用EMPTY_BLOB()。这是的内部函数,返回一个LOB的定位符。在插入LOB时,只能用这个办法先生成一个空的LOB定位符,然后对这个定位符进行操作。EMPTY_BLOB()是针对BLOB类型的,对应于CLOB的是EMPTY_CLOB()。二是RETURNING后面的部分,把picture返回,让的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_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(),分别用来保存和取出数据。但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()之前,要确保值不能为空。否则,会出错。

[1]  

 

 

上一篇:PHP程序员的优化调试技术和技巧   下一篇:正确理解PHP程序编译时的错误信息
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论
  热点文章
·通过对PHP服务器端特性的配置加
·php与mysql三日通
·AJAX技术在PHP开发中的简单应用
·大家所使用的PHP开发环境
·PHP缓存的实现
·针对PHP新手总结的PHP基础知识
·一个简单实现多条件查询的例子
·PHP串行化变量和序列化对象
·PHP表单
·推荐阅读:php技术生成静态页面
·php实用函数
·php生成随机数
  相关文章
·PHP程序员的优化调试技术和技巧
·正确理解PHP程序编译时的错误信
·PHP程序加速探索之加速工具软件
·PHP实现简单线性回归之数学库的
·让你的PHP引擎全速运转的三个绝
·用PHP读取和编写XML DOM
·用PHP与XML联手进行网站开发
·PHP实现简单线性回归之数据研究
·PHP程序加速探索之缓存输出
·PHP开发中接收复选框信息的方法
·理解PHP中的MVC编程之控制器
·PHP开发中关于文件操作的疑难问
  相关信息
copy right @ 百家拳软件项目研究室 2007 辽ICP备07011763