【转】Oracle + PHP Cookbook(php oracle clob 长度超过4000如何写入)
|
在甲骨文LOB和PHP工作 达到4,000字节的限制?输入LOB ... 在这个“Oracle + PHP Cookbook”HowTo中,您将学习可用的LOB类型和与之相关的问题,然后探索PHP中常见的LOB操作的示例。使用像VARCHAR2这样的Oracle类型是很好的,但是如果你需要能够一次存储超过4,000字节的限制呢?对于此任务,您需要一个Oracle的长对象(LOB)类型,这反过来要求您了解如何使用PHP API来处理LOB。这本身对于那些不熟悉它的人来说是令人生畏的。 Oracle中的长对象 Oracle提供以下LOB类型:
LOB的另一个子类是临时LOB,它可以是BLOB,CLOB或NCLOB,但存储在临时表空间中,直到您释放它。 请注意,旧版本的Oracle分别为字符和二进制数据提供了LONG和LONG RAW类型。随着Oracle9需要我这些赞成的LOB被弃用。 LOB存储。对于BLOB,CLOB和NCLOB类型,Oracle数据库10 ğ能够在一个单一的值存储高达128TB,这取决于你的数据库块大小和“块”设置,为LOB定义的。 LOB本身包括两个元素:LOB内容和LOB定位符,其是到LOB内容的“指针”。这种分离需要允许Oracle存储和有效地管理LOB和它反映在使用到PHP的API INSERT, 数据库,和 选择的LOB(见下文)。 对于内部LOB类型(即不是BFILE),如果LOB的大小小于4KB,则Oracle将在表中存储LOB的内容以及行的其余部分。大于4KB的LOB在默认情况下在表的表空间中存储为“out-of-line”。此方法允许快速检索小LOB,而对于大LOB,访问时间将较慢,但是在扫描表时的整体性能被保留。 还有LOB存储和访问的其他选项,例如内存缓存和缓冲 - 这可以提高性能,具体取决于您的应用程序的具体情况。欲了解更多信息,请参阅 LOB性能指南和 Oracle数据库应用程序开发人员指南-大型对象在Oracle文档中获得。 LOB的限制。许多限制适用于使用LOB类型,最重要的是它们在SQL语句中的使用。您不能在以下任何查询中使用LOB类型。 SELECT DISTINCT <lob_type> 这也是非法的表连接,使用LOB类型列 UNION, INTERSECTION和 MINUS语句。 其他限制适用于LOB使用的其他方面,例如,您不能将LOB用作主键列。再次,看 Oracle数据库应用程序开发人员指南-大型对象的详细信息。 CLOB和字符集 数据库的默认字符集由参数NLS_CHARACTERSET定义,并且放置在CLOB中的文本应使用此字符集进行编码。使用此SQL来确定您的数据库字符集编码: SELECT value FROM nls_database_parameters WHERE parameter ='NLS_CHARACTERSET' 由于缺乏对PHP中NCLOB的支持,您可能需要考虑使用Unicode编码作为数据库字符,例如UTF-8,可以使用以下语句完成(给予足够的权限): ALTER数据库字符集UTF8 注意:不要在不理解影响的情况下尝试此操作,尤其是如果现有数据或应用程序代码使用不同的字符集。看到 甲骨文全球化支持指南和对全球化的Oracle PHP应用程序概述了解更多信息。 使用LOB 这里的讨论将集中在PHP的OCI8扩展。还值得注意的是,Oracle提供了DBMS_LOB包,其中包含使用PL / SQL处理LOB的并行过程和函数。 PHP OCI8扩展在全局PHP命名空间中注册了一个名为“OCI-Lob”的PHP类。当您执行 SELECT语句,例如,其中一列是一个LOB类型,PHP将自动绑定这个到OCI-LOB对象实例。一旦你有一个OCI高球对象的引用,你可以调用方法一样 的load()和 save()方法来访问或修改LOB的内容。 可用的OCI高球的方法将取决于你的PHP版本,PHP5特别是具有像获得方法 的read() , 求()和 追加() 。在 PHP手册是有点不清楚,在这种情况下,版本号,所以如果有疑问,您可以验证使用下面的脚本。 <?php 在我的系统上,运行PHP 5.0.5,我得到以下列表的方法: OCI-Lob :: load() 在实践中,PHP 4.x OCI8扩展仅支持读取或写入完整的LOB,这是Web应用程序中最常见的用例。PHP5扩展是为了让LOB的“块”的阅读和写作,以及支持LOB缓冲的方法 setBuffering()和 getBuffering() 。PHP5还提供了独立的功能 oci_lob_is_equal()和 oci_lob_copy() 。 此处的示例将使用新的PHP5 OCI函数名(如 oci_parse而不是 OCIParse)。示例使用以下序列和表: CREATE SEQUENCE mylobs_id_seq 注意,这里的大多数示例使用CLOB,但是相同的逻辑也可以几乎完全应用于BLOB。 插入LOB 要 INSERT内部LOB,首先需要使用相应的Oracle初始化LOB EMPTY_BLOB或 EMPTY_CLOB功能,您无法更新一个包含NULL值的LOB。 初始化后,你再绑定列到PHP OCI-LOB对象和更新通过对象的LOB的内容 保存()方法。 下面的脚本提供了一个示例,返回从该LOB类型 INSERT查询: <?php 请注意这个例子中如何使用事务,指示 oci_execute与 OCI_DEFAULT常量等待 oci_commit或 oci_rollback。这一点很重要,因为我有两个阶段发生在 INSERT -首先创建行和第二次更新的LOB。 需要注意的是,如果我是用BLOB类型,唯一需要的变化(假设BLOB列)的工作是对 oci_bind_by_name调用: oci_bind_by_name($ stmt,“:mylob_loc”,$ myLOB,-1,OCI_B_BLOB); 或者,您可以直接绑定字符串,而不指定LOB类型; <?php 这种方法大大简化了代码,适合当你想要写入到LOB的数据相对较小。相反,如果你想大文件的内容流成LOB,你可以通过文件的内容循环调用 write()方法和 冲洗()的PHP LOB对象写较小的块上,而不是整个文件在单个实例中保持在内存中。 选择LOB 当 SELECT查询包含一个LOB列,PHP将自动绑定列到OCI-LOB对象。例如: <?php 这可以通过使用进一步简化 OCI_RETURN_LOBS恒定,与所用 oci_fetch_array() ,指示它替换为它们的值LOB对象: while($ row = oci_fetch_array($ stmt,OCI_ASSOC + OCI_RETURN_LOBS)){
更新LOB 要 UPDATE一个LOB,它也可以使用 “回归”中的SQL命令,与上面 的INSERT的例子,但一个更简单的方法是 SELECT ... FOR UPDATE: <?php 如同 INSERT,我需要执行 UPDATE使用事务。一个重要的附加步骤是将呼叫 截断() 。当更新与一个LOB 保存() ,将取代的LOB的从启动开始新的数据的长度的内容。这意味着较旧的内容(如果它比新的内容更长)可能仍然留在LOB中。 对于PHP 4.x中,在 截断()是不可用的,下面的替代解决方案使用Oracle的 EMPTY_CLOB()函数的新数据保存到前擦除在LOB任何现有内容。 $ sql =“UPDATE 使用BFILES 当使用BFILE类型, INSERT S和 UPDATE刻薄告诉甲骨文在该文件所在的数据库服务器(可能不是同一台机器作为Web服务器)的文件系统中,而不是传递文件内容。使用 SELECT语句,您可以通过Oracle读取BFILE的内容,应该你愿意的话,或致电函数和过程从DBMS_LOB包,以获取有关文件的信息。 BFILE的主要优点是能够直接从文件系统访问原始文件,同时仍然能够使用SQL查找文件。这意味着,例如,图像可以直接由Web服务器提供,而我可以跟踪包含BFILES的表格和“用户”表之间的关系,告诉我谁上传了文件。 例如,我首先需要更新上面使用的表模式; ALTER TABLE mylobs ADD(mybfile BFILE) 接下来,我需要向Oracle注册目录别名(这需要管理权限),并授予读取它的权限: CREATE DIRECTORY IMAGES_DIR AS'/ home / harryf / public_html / images' 我现在可以 INSERT像一些BFILE的名称: <?php 如果我需要,我可以通过Oracle读取BFILE内容使用与上面相同的方法,我选择CLOB。或者,如果我需要获得文件名后面,所以我可以从文件系统中直接访问它们,我可以调用 DBMS_LOB.FILEGETNAME程序,如: <?php 此外,还可以使用 DBMS_LOB.FILEEXISTS功能来发现哪些文件已通过操作系统被删除,但在数据库中仍引用。 结论 在此方法文档中,你已经被介绍给不同类型的Oracle数据库10个可用的LOB 摹,希望现在了解他们在允许大型数据实体高效地存储在数据库中的作用。您还学习了如何使用PHP的OCI8 API来处理LOB,涵盖了在使用Oracle和PHP开发时遇到的常见用例。 哈利Fuecks [ http://www.phppatterns.com ]是一个知名的PHP开发人员和作家,自1999年发现PHP他发表了许多介绍,并通过中间PHP文章 Sitepoint网站开发者的网络,以及写作 的PHP文集(SitePoint)。 |
原文地址:http://www.oracle.com/technetwork/articles/fuecks-lobs-095315.html
【转】Oracle + PHP Cookbook(php oracle clob 长度超过4000如何写入)的更多相关文章
- clob字段超过4000转String类型
上次提到listagg()和wm_concat()方法合并过的字段类型为clob,要是字段长度超过4000,直接使用to_char()方法转会报错. 解决方法可以在java代码中使用流的方式转化成字符 ...
- php/oracle: 解析oracle表中的NCLOB,CLOB字段里面的内容
php/oracle: 解析oracle表中的NCLOB,CLOB字段里面的内容 假如你的字段名是:passenger_info 字段类型是:NCLOB/CLOB,在读表的时候,需要将 passeng ...
- 根据 oracle 标准计算超长字符串的长度
Oracle 数据库使用 sql语句 : select lengthb('输入字符串') from dual , 来计算 字符串 所占的字节长度(比如,一个汉字3个字节),但是用这个leng ...
- 转 Oracle全文检索http://docs.oracle.com/cd/E11882_01/text.112/e24436/toc.htm
SQL > exec ctx_ddl.create_preference ('my_test_lexer','chinese_lexer') : PL/SQL 过程成功完成 SQL > E ...
- JAVA-Unit02: Oracle字符串操作 、 Oracle数值操作 、 Oracle日期操作 、 空值操作
Unit02: Oracle字符串操作 . Oracle数值操作 . Oracle日期操作 . 空值操作 DQL数据查询语言 查询语句基本由SELECT子句由FROM子句构成. SELECT子句指定要 ...
- Oracle 11g XE 与 Oracle SQL Developer 的配置与使用(重制版)
Oracle 11g XE 与 Oracle SQL Developer 的配置与使用(重制版) 前提概要 项目上需求要适应Oracle数据库,当然这和某EF框架也有关. 因为Oracle 的表名和列 ...
- 吴裕雄--天生自然 oracle学习笔记:oracle理论学习详解及各种简单操作例子
1. 数据库的发展过程 层次模型 -->网状模型 -->关系模型 -->对象关系模型 2. 关于数据库的概念 DB:数据库(存储信息的仓库) DBMS:数据库管理系统(用于管理数据库 ...
- Oracle缓存表与Oracle缓存的区别
一.Oracle缓存表 与 Oracle缓存 的概念 Oracle 缓存:是把Oracle近期查询的语句放置在Oracle设定的缓存当中. Oracle 缓存表:是把某个表放置在缓存当中,缓存是Ora ...
- Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之ORACLE集群概念和原理(二)
ORACLE集群概念和原理(二) 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习的汇总.然后形成体 ...
随机推荐
- javascript面向对象2
原文:javascript面向对象2 首先我们先创建一个对象 var user = Object(); user.name = "张三"; user.age = 20; user. ...
- Javascript多线程引擎(十)---Web服务器
Javascript多线程引擎(十)---Web服务器 经过一天的努力, 引擎可以支持web服务的功能了并且支持UTF-8的编码, 具有对HTTP参数的解析,状态码的配置, 响应报文的输出等. 提供 ...
- Web Components
Web Components是不是Web的未来 今天 ,Web 组件已经从本质上改变了HTML.初次接触时,它看起来像一个全新的技术.Web组件最初的目的是使开发人员拥有扩展浏览器标签的能力,可以 ...
- storm安装(3)storm本身的安装
(6)下载storm包放入home文件夹中, 这里我用的版本是storm-0.8.2.zip 添加权限 chmod +x storm-0.8.2.zip 进行文件的解压 unzip storm-0.8 ...
- 1572: [Usaco2009 Open]工作安排Job[贪心]
Description Farmer John 有太多的工作要做啊!!!!!!!!为了让农场高效运转,他必须靠他的工作赚钱,每项工作花一个单位时间. 他的工作日从0时刻开始,有1000000000个单 ...
- 默认python2.6切换成python27
# 安装修改pythonyum -y install python27 python27-devel python -V; python2.6 -V # 查看当前python版本 这两个应该都 ...
- WEB安全入门
WEB安全入门 信息安全基础 信息安全目标 真实性:对信息的来源进行判断,能对伪造来源的信息予以鉴别, 就是身份认证. 保密性:保证机密信息不被窃听,盗取,或窃听者不能了解信息的真实含义. 完整性:保 ...
- jquery禁用右键单击、F5刷新
1.禁用右键单击功能 $(document).ready(function() { $(document).bind("contextmenu",function(e) { ale ...
- js中的“闭包”
js中的“闭包” 姓名:闭包 官方概念:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. ( ⊙o⊙ )!!!这个也太尼玛官方了撒,作为菜鸟的 ...
- 如何对软件开发工具 WebBuilder 进行安装?
WebBuilder是一款开源的可视化Web应用开发和运行平台.基于浏览器的集成开发环境,采用可视化的设计模式,支持控件的拖拽操作,能轻松完成前后台应用开发:高效.稳定和可扩展的特点,适合复杂企业级应 ...