background image

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,