用
PHP 操纵 Oracle 的 LOB 类型的数据
PHP Oracle(OCI)初步》中讲了如何用 PHP 中的 OCI 函数来连接 Oracle 数据库,执行一些
SQL 查询及关闭数据库连接。本文将讲述另一个难度稍大的问题:用 PHP 的 OCI 函数来操
纵
Oracle 的 LOB 字段。阅读本文需要《PHP Oracle(OCI)初步》一文中的知识。
用过
Oracle 的人都知道,Oracle 有一种数据类型叫 VARCHAR2,用来表示不定长的字符串。
VARCHAR2 也是 Oracle 公司推荐使用的类型。但使用 VARCHAR2 有个问题:最大只能表
示
4000 个字符,也就相当于 2000 个汉字。如果你的程序中某个字符的值要大于 20002 个汉
字,用
VARCHAR2 就不能满足要求了。这时候,你有两个选择,一是用多个 VARCHAR2
来表示,二是用
LOB 字段。这里我们来看看第二个办法。
先来大体了解一下
Oracle 的 LOB 字段。Oracle 的 LOB 类型分为三种: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 当作一种特殊的数据类型来处理,在
操作上不能用常规的方法。比如,不能在
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 中,操作稍有不同)中。
首先要建一个表,结构如下:
CREATETABLEPICTURES(
IDNUMBER,