BS结构中使用PHP访问ORACLE LOB

   PHP,即“PHP: Hypertext Preprocessor”,是一种广泛用于 Open Source(开放源代码)并可以嵌入 HTML 的多用途脚本语言。它的语法接近 C、Java 和 Perl,易于学习。该语言的主要目标是让 Web 开发人员快速的书写动态生成的网页,然而,PHP 的功能并不局限于此。PHP普遍被认为可以更快和更有效地实现复杂的编程任务,而且正是因为它的更稳定以及占用更少资源的优点成为开发B/S结构系统的必备的WEB脚本设计语言,扮演着类似中间件的角色,即语法解析与执行。

  ORACLE LOB数据模型

   在B/S(Browser/Server,浏览器/服务器)应用系统中,需要存储的已不仅仅是简单的文字信息,同时还包括一些图片和音像资料或者是超长的文本。比如开发一套公文系统,公文中的图表、附件等二进制文件或超长文本将无法使用普通的字符或其他类型的数据描述,这就要求后台数据库要有存储这些数据的能力。运用Oracle LOB对象可实现该功能。

   Oracle LOB是用来存储大量的二进制和文本数据的一种数据类型(一个LOB字段可存储可多达4GB的数据)。目前,它又分为两种类型:内部LOB和外部LOB。内部LOB将数据以字节流的形式存储在数据库的内部。因而,内部LOB的许多操作都可以参与事务,也可以像处理普通数据一样对其进行备份和恢复操作。Oracle8i支持三种类型的内部LOB:BLOB(二进制数据)、CLOB(单字节字符数据)、NCLOB(多字节国家字符数据)。其中CLOB和NCLOB类型适用于存储超长的文本数据,BLOB字段适用于存储大量的二进制数据,如图像、视频、音频等。目前,Oracle8i只支持一种外部LOB类型,即BFILE类型。在数据库内,该类型仅存储数据在操作系统中的位置信息,而数据的实体以外部文件的形式存在于操作系统的文件系统中。因而,该类型所表示的数据是只读的,不参与事务。该类型可帮助用户管理大量的由外部程序访问的文件。

  PHP Oracle 8 函数分析

   PHP中有两套ORACLE函数扩展库,其中的ORACLE8函数允许访问 Oracle8 和 Oracle7 数据库,这些函数使用了Oracle8 Call-Interface(OCI8),支持向 Oracle 位置标志符绑定局部和全局 PHP 变量,全面支持 LOB、FILE 和 ROWID,允许用户使用用户自定义的变量,即用户数据库的自定义对象类。

   Oracle8函数库中函数OCIFetchInto用于取回一行数据记录放入数组中,该函数的语法描述如下:

int OCIFetchInto(array &result, int [mode])

   其中,参数mode可省略,内定值为OCI_NUM。在访问Oracle LOB时,如果希望返回LOB对象,则mode应设为OCI_ASSOC+OCI_RETURN_LOBS。

   函数OCIBindByName用于将PHP变量与Oracle对象进行绑定,从而建立PHP与Oracle之间的数据通讯,该函数语法描述为:

boolean OCIBindByName(int stmt, string ph_name, mixed &variable, int length, int [type])

   其中:参数stmt是经过Oracle解析函数OCIParse解析后的字串指标。参数ph_name即需绑定的ORACLE返回变量名称;参数variable前面一定要加&符号,表PHP变量地址。参数length为变量的长度,若设为-1则使用指定的variable变量的最大值;参数type可省略,其值有OCI_B_FILE(二进制文件)、OCI_B_CFILE(文本文件)、OCI_B_CLOB(文字LOB)、OCI_B_BLOB(位元LOB)及OCI_B_ROWID(ROWID)等数种。值得注意的是,如使用Oracle8中特有的新数据类型LOB/ROWID/BFILE时,需要先执行 OCINewDescriptor()函数,同时必须要将length参数设成 -1。

   函数OCINewDescriptor用于初始化新的LOB/FILE描述。该函数语法描述为:

string OCINewDescriptor(int connection , int [type])

   其中的type同OCIBindByName函数中的type定义。

  必须的环境配置

   使用PHP的ORACLE8函数库需要Oracle8客户端库。在使用这个扩展之前,请确认你已经为Oracle 用户和WEB daemon 用户正确设置了 Oracle 环境变量。下面列出了需要设置的环境变量:

ORACLE_HOME #ORACLE安装路径
ORACLE_SID # ORACLE数据库ID
LD_LIBRARY_PATH #LD联接库路径
NLS_LANG #ORALCE地区(语言)设置
ORA_NLS33 # ORA_NLS33路径
  为Linux环境下验证以上变量是否正确,最佳的办法就是分别在oracle用户与nobody下执行:

# env

   根据输出的结果,判断上述环境变量是否一致。

   在为WEB 服务器用户设置环境变量之后,你还需要将WEB 服务器用户(nobody、 www)加到oracle组中。

   有关ORACLE8客户端和PHP安装设置的详细说明,请参考相关的技术手册。

  应用范例

   在PHP中上载并将文件存储在ORACLE LOB字段中的应用范例如下:

//LOB对象初始化,获取PHP变量指针

$lob = OCINewDescriptor($conn, OCI_D_LOB);

//向有关的文件记录表添加纪录,ORACLE SQL语法解释

$stmt = OCIParse($conn,"update T_FILE set FILENAME='".$_FILES['FJ1']['name'].
"',FILETYPE='".$_FILES['F1']['type']."',FILES=EMPTY_BLOB() where FILEID=".$newid." returning FILES into :lob");

//绑定LOB变量

OCIBindByName($stmt, ':lob', &$lob, -1, OCI_B_BLOB);

OCIExecute($stmt, OCI_DEFAULT);//执行语句

if($lob->savefile($F1)){//将表单提交的文件通过lob指针存入ORACLE数据库

OCICommit($conn);

//成功上传

}else{

//未能成功上传

}

OCIFreeDesc($lob);

OCIFreeStatement($stmt);

//结束

  在PHP中将文件从数据库中提取并下载的应用范例如下:

$stmt = OCIParse($conn,"SELECT * FROM T_ FILE WHERE FILEID =$ID");

OCIExecute($stmt);

if(OCIFetchInto($stmt,$result,OCI_ASSOC+OCI_RETURN_LOBS)){

//输出文件类型信息供浏览器判断

header("Content-type: ".$result[FILETYPE]);

//输出文件名,浏览器可提示是否打开或下载该文件

header("Content-Disposition: attachment; filename=".$result[FILENAME]);

//以上关于header函数的使用可参考PHP manual,HTML的文件头信息请参考Internet RFC 2616。

//输出文件流,在此,浏览器获取文件内容,出现正在下载或直接打开文件的提示

echo $result[FILES];

}

OCIFreeStatement($stmt);

//结束

  以上范例仅是应用的关键语句,并在Linux+PHP+Apache+Oracle8i平台上通过了验证,读者可根据自身需要进行完善和补充。

  结束语

  本文探讨PHP对ORACLE LOB访问的实现,仅是PHP在B/S结构系统中基本运用技术所涉及的一个方面。笔者曾对比了JDBC与PHP-OCI两者的执行效率,以JDBC为访问引擎的OAS HTTP Server(HTTP Server为apache2.0)的响应速度要逊于建立在Linux+Aache+PHP-OCI平台之上的WEB Server,这其中当然有Linux的出色表现,但不可否认的是,PHP与OCI的组合是非常优秀的。

  由于缺乏ORACLE LOB与PHP ORACLE8函数库相结合运用的尝试,在开发信息管理系统中,为实现对大型数据文件的管理,PHP在此方面的功能并未得到有效的利用,希望本文对从事PHP数据库技术却遇到此方面难题的程序员会有所帮助。

(0)

相关推荐

  • Oracle中scott表结构与简单查询实例分析

    本文实例讲述了Oracle中scott表结构与简单查询的方法.分享给大家供大家参考.具体分析如下: 1.scott用户的表的结构 查看表结构 desc 表名;//desc emp; emp表: SQL> desc emp; 名称 是否为空? 类型 ----------------- -------- ------------ EMPNO NOT NULL NUMBER(4) 雇员编号 ENAME VARCHAR2(10) 雇员姓名 JOB VARCHAR2(9) 雇员职位 MGR NUMBER(

  • Oracle SQL树形结构查询

    oracle中的select语句可以用START WITH...CONNECT BY PRIOR子句实现递归查询,connect by 是结构化查询中用到的,其基本语法是: 复制代码 代码如下: select * from tablename start with cond1 connect by cond2 where cond3; 简单说来是将一个树状结构存储在一张表里,比如一个表中存在两个字段: id,parentid那么通过表示每一条记录的parent是谁,就可以形成一个树状结构. 用上

  • Oracle 11g Release (11.1) 索引底层的数据结构

    本文内容 B-树(B-tree) 散列(Hash) k-d 树(k-d tree) 点四叉树(Point Quadtree) 本文介绍关于 Oracle 索引的结构.大概了解 Oracle 索引底层的数据结构,从而更好地理解 Oracle 索引对增.删.改.查的性能. B-树(B-tree) 非索引的结构能满足所有需要,但自平衡的 B-树索引结构更能优化在大数据集上检索的性能.每个 B-树节点拥有多个键和指针.特定 B-树支持的一个节点中键的最大数量是那颗树的顺序.每个节点都具有一个潜在的 or

  • oracle逻辑结构分析

    oracle的逻辑结构包括表空间(tablespace),段(segment),区(extent),数据块(data block) oracle数据库在逻辑上是由多个表间组成的,表空间中存储的对象叫段,比如数据段,索引段,和回退段.段由区组成,区是磁盘分配的最小单位.段的增大是通过增加区的个数来实现的.每个区的大小是数据块大小的整数倍,区的大小可以不相同:数据块是数据库中最小的I/O单位,同时也是内存数据缓冲区的单位,及数据文件存储空间单位.块的大小由参数DB_BLOCK_SIZE设置,其值应设

  • oracle复制表结构和复制表数据语句分享

    1. 复制表结构及其数据: 复制代码 代码如下: create table table_name_new as select * from table_name_old 2. 只复制表结构: 复制代码 代码如下: create table table_name_new as select * from table_name_old where 1=2; 或者: 复制代码 代码如下: create table table_name_new like table_name_old 3. 只复制表数据

  • oracle 数据库学习 基本结构介绍

    普及一下oracle的基础知识,总结一下,oracle 是由实例和数据库组成.结构如下: oracle数据库由实例.数据库组成: * 数据库由数据文件(包含oracle 数据.索引.表结构等数据).控制文件(包括每个表的操作信息).日志文件(数据操作sql语句).参数文件.口令文件.日志归档文件(归档模式下)(服务器崩溃.硬盘损坏情况下,通过日志恢复时用) * 实例由 内存结构(memory strutct) 和 后台进程(background processor)组成. 内存结构组成: * P

  • BS结构中使用PHP访问ORACLE LOB

    PHP,即"PHP: Hypertext Preprocessor",是一种广泛用于 Open Source(开放源代码)并可以嵌入 HTML 的多用途脚本语言.它的语法接近 C.Java 和 Perl,易于学习.该语言的主要目标是让 Web 开发人员快速的书写动态生成的网页,然而,PHP 的功能并不局限于此.PHP普遍被认为可以更快和更有效地实现复杂的编程任务,而且正是因为它的更稳定以及占用更少资源的优点成为开发B/S结构系统的必备的WEB脚本设计语言,扮演着类似中间件的角色,即语法

  • php 访问oracle 存储过程实例详解

    php 访问oracle 存储过程实例详解 比如我的本地Oracle数据库有一个package,里面有一个存储过程: create or replace package PKG_TRANS_REL is -- Author : test -- Created : -- Purpose : test -- Public type declarations PKG_NAME varchar2(20) := 'PKG_TRANS_REL'; --存储过程,测试用 procedure pro_GC_wi

  • 限制ip访问Oracle数据库的方法步骤

    一.概述 本文将给大家介绍如何限制某个ip或某个ip段才能访问Oracle数据库 通过sqlnet.ora 通过/etc/hosts.deny和/etc/hosts.allow 通过iptables 二.正式实验 本次实验环境是Centos6.10 + Oracle 11.2.0.4单实例,数据库服务器ip地址为192.168.31.71 1. 通过sqlnet.ora a. 关闭数据库服务器上的防火墙,修改sqlnet.ora文件 该文件放在$ORACLE_HOME/network/admin

  • PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤

    背景: 同一个项目两个系统分别使用了PG库和Oracle库,Oracle是生产库,数据动态更新,现在在PG库中需要实时的获取到更新的数据进行统计,基于此种方式,可以通过ETL的工具实现,但是需要定期进行维护等,于是想着是否可以通过类似于Oracle数据库DBLINK的方式去实现,经过网上查找相关资料,发现可以通过oracle_fdw实现. 测试环境: 本地搭建测试环境,基础配置如下: Oracle数据库测试服务器(IP:192.168.1.110):WIN10操作系统,Oracle数据库版本为1

  • PHP使用PDO访问oracle数据库的步骤详解

    前言 PDO 从一开始就吸取了现有数据库扩展成功和失败的经验教训.因为 PDO 的代码是全新的,所以我们有机会重新开始设计性能,以利用 PHP 5 的最新特性. PDO 旨在将常见的数据库功能作为基础提供,同时提供对于 RDBMS 独特功能的方便访问. 虽然LAMP中PHP和Mysql是标准配对,但是公司的项目是Mysql和Oracle分别作为运行库和详单库的,所以PHP连接oracle数据库也是必须要实现的.本篇文章就介绍下如果通过PDO连接到oracle数据库,下面话不多说了,来一起看看详细

  • PDO取Oracle lob大字段,当数据量太大无法取出的问题的解决办法

    首先,创建一个存储过程 get_clob: t_name:要查询的表名:f_name:要查询的字段名:u_id:表的主键,查询条件:l_pos:截取的开始位置: l_amount :截取长度: CREATE OR REPLACE PROCEDURE get_clob(t_name in varchar2, f_name in varchar, u_id in integer, l_pos in integer, l_amount in BINARY_INTEGER, ReturnValue ou

  • 在JSP中访问Oracle数据库

    写第一个连接Oracle的JSP程序test.jsp1.连入SQL*Plus以system/manager用户登录,SQL> conn system/manager创建新的用户:如user1/pass1,赋予connect,resource权限.SQL> grant connect,resource to user1 identified by pass1;SQL> conn user1/pass1SQL> create table test(a number,b char(10)

  • ORACLE错误一览表 方便查询

    ORACLE错误一览表,方便大家查询! ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ORA-00020: 超出最大进程数 () ORA-00021: 会话附属于其它某些进程:无法转换会话 ORA-00022: 无效的会话 ID:访问被拒绝 ORA-00023: 会话引用进程私用内存:无法分离会话 ORA-00024: 单一进程模式下不允许从多个进程注册 ORA-000

  • PHP 5 数据对象 (PDO) 抽象层与 Oracle

    一名新 PHP 数据对象 (PDO) 数据抽象层的原始开发人员为您简要介绍该抽象层,重点讲述与 Oracle 一起运行的情况. 需要 PHP:5.0需要其他:Oracle 8 或更高版本客户端库下载用于 Oracle 的 PDO (Windows):php_pdo.dll, php_pdo_oci.dll下载用于 Oracle 的 PDO (Unix):pdo, pdo_oci PDO 简介 PHP 主要是由志愿者完成的项目:尽管有少数一些固定的"核心"开发人员,但是我们没有一个人在全

  • 如何将Oracle的一个大数据表快速迁移到 Sqlserver2008数据库(图文教程)

    oracle 服务器  版本  11.2.0.1.0 Sqlserver2008  R2 前提条件是 SQLSERVER服务器上安装了Oracle客户端并且进行了配置 不会配置的请参照 这个链接 1  登录MSSM 工具 2 选中其中一个数据库  右键⇒任务⇒导入数据 3   打开窗口 Sqlserver导入和导出向导   点击下一步 4 进入选择数据源画面 a: 数据源 选择  Microsoft OLE DB Provider for Oracle  然后 点击 右侧的 属性 按钮 5  数

随机推荐