`
897371388
  • 浏览: 529239 次
文章分类
社区版块
存档分类
最新评论

Oracle9i PHP 操作 CLOB字段

 
阅读更多

场景描述:

将oracle11g的含clob字段的数据抽取到oracle9i,发现oracle9i对clob的支持没11g的强大,导致php进行入库操作时报错


从网上找到的解决办法,每行记录包含一个clob字段比较好解决,但是包含多个clob字段,不太好解决,目前没找到好的解决办法,、

以下是从网上查到的资料


1. 单个clob操作,转载地址:http://www.cnblogs.com/jiafan/archive/2008/06/23/1228300.html


如果接触过mysql的话一定对mysql的text和blob不会陌生,在mysql中是直接操作text和blob的;

但是在oracle中,它把lob做为一种特殊的字段,不能直接进行操作--比如不能直接插入到lob字段中,也不能用like查询等等。
不能直接用INSERT语句向LOB字段中插入值。一般情况下,有如下的几步:
1 先分析一个INSERT语句,返回一个LOB的描述符
2 用OCI函数<nobr id="clickeyekey0" style="color:rgb(102,0,255); border-bottom-color:rgb(102,0,255); border-bottom-width:1px; border-bottom-style:dotted; background-color:transparent; text-decoration:underline">生成</nobr>一个本地的LOB对象
3 将LOB对象绑定到LOB描述符上
4 执行INSERT语句
5 给LOB对象赋值
6 释放LOB对象和SQL语句句柄
/*
//(tabel_name:article)DDL; //just for test;
//create table article(id number(11),content clob);
*/

//----------This is insert test----------------------------------
$conn = @OCILogon("YourUsername","YourPassword","YourDatabase");
$stmt = @OCIParse($conn,"insert into article values(1,EMPTY_CLOB()) RETURNING content INTO:CONTENT");
$clob = @OCINewDescriptor($conn,OCI_D_LOB);
OCIBindByName($stmt,':CONTENT',&$clob,-1,OCI_B_CLOB);
if(!OCIExecute($stmt, OCI_DEFAULT)) {print_r(OCIError($stmt));}
if($clob->save($CONT)) //把要入库的变量初始化到这里$CONT,看半天才看懂,哎,惭愧
{
OCICommit($conn);
}else{
print_r(OCIError($stmt));
}

//---------------Insert end-----------------------------------------

//---------------Select start---------------------------------------
$sql = "select content from article order by id desc";
$stmt = @OCIParse($conn,$sql);
@OCIExecute($stmt,OCI_DEFAULT);
@OCIFetchInto($stmt,&$rows,OCI_RETURN_LOBS);
echo "<br>Content is:\"".$rows[0]."\"";

//---------------Select end---------------------------------------


2. 同时操作多个字段,转载地址:http://cshongyin.blog.163.com/blog/static/16818875920123159524908/


在php使用了oci接口连接oracle,结果发现插入一组数据的时候不能同时插入多个clob变量,


PHP:OCI :Manue中给出的例子是:


<?php

//Beforerunning,createthetable:
//CREATETABLEmytab(mykeyNUMBER,myclobCLOB);

$conn=oci_connect('hr','welcome','localhost/XE');
if(!
$conn){
$e=oci_error();
trigger_error(htmlentities($e['message']),E_USER_ERROR);
}
$mykey=12343;//arbitrarykeyforthisexample;
$sql="INSERTINTOmytab(mykey,myclob)
VALUES(:mykey,EMPTY_CLOB())
RETURNINGmyclobINTO:myclob"
;
$stid=oci_parse($conn,$sql);
$clob=oci_new_descriptor($conn,OCI_D_LOB);
oci_bind_by_name($stid,":mykey",$mykey,5);
oci_bind_by_name($stid,":myclob",$clob,-1,OCI_B_CLOB);
oci_execute($stid,OCI_DEFAULT);
$clob->save("Averylongstring");
oci_commit($conn);

//FetchingCLOBdata
$query='SELECTmyclobFROMmytabWHEREmykey=:mykey';
$stid=oci_parse($conn,$query);
oci_bind_by_name($stid,":mykey",$mykey,5);
oci_execute($stid);
print
'<tableborder="1">';
while(
$row=oci_fetch_array($stid,OCI_ASSOC)){
$result=$row['MYCLOB']->load();
print
'<tr><td>'.$result.'</td></tr>';
}
print
'</table>';
?>


但是,插入多个clob的情况没有说,查了好久也没查出什么好的方法,最后通过用update解决了,虽然解决的不是很好,还以上面情况来说
<?php

//Beforerunning,createthetable:
//CREATETABLEmytab(mykeyNUMBER,myclobCLOB, mycc CLOB);

$conn=oci_connect('hr','welcome','localhost/XE');
if(!
$conn){
$e=oci_error();
trigger_error(htmlentities($e['message']),E_USER_ERROR);
}
$mykey=12343;//arbitrarykeyforthisexample;
$sql="INSERTINTOmytab(mykey,myclob, mycc)
VALUES(:mykey,EMPTY_CLOB(), EMPTY_CLOB())
RETURNINGmyclobINTO:myclob"
;
$stid=oci_parse($conn,$sql);
$clob=oci_new_descriptor($conn,OCI_D_LOB);
oci_bind_by_name($stid,":mykey",$mykey,5);
oci_bind_by_name($stid,":myclob",$clob,-1,OCI_B_CLOB);
oci_execute($stid,OCI_DEFAULT);
$clob->save("Averylongstring1");
oci_commit($conn);

$sql="UPDATE mytab set mycc = EMPTY_CLOB() WHERE mykey = :mykey
RETURNINGmyccINTO:mycc"
;
$stid=oci_parse($conn,$sql);
$clob=oci_new_descriptor($conn,OCI_D_LOB);
oci_bind_by_name($stid,":mycc",$clob,-1,OCI_B_CLOB);
oci_execute($stid,OCI_DEFAULT);
$clob->save("Averylongstring2");
oci_commit($conn);


//FetchingCLOBdata

$query='SELECTmyclob, mycc FROMmytabWHEREmykey=:mykey';
$stid=oci_parse($conn,$query);
oci_bind_by_name($stid,":mykey",$mykey,5);
oci_execute($stid);
print
'<tableborder="1">';
while(
$row=oci_fetch_array($stid,OCI_ASSOC)){
$result=$row['MYCLOB']->load();
print
'<tr><td>'.$result.'</td>';
$result=$row['MYCC']->load();
print
'<td>'.$result.'</td></tr>';

}
print
'</table>';

?>
虽然解决了,但是如果有n个CLOB,就需要n次update,显然效率非常低,期待好的做法




分享到:
评论

相关推荐

    oracle10g数据导入到oracle9i解决方案

    oracle9.2.0.5以前的版本导出带有BLOB,CLOB等大字段的时候会报错,oracle9.2.0.5以后的版本不会出现此错误。oracle9.2.0.5以前的版本导出带有BLOB,CLOB等大字段的时候会报错解决办法:

    oracle替换wm_concat varchar处理为clob处理的方法

    是处理wm_concat中以varchar处理合并列字段过小。 clob 可以加大处理。 oracle 9I oracle 10G 必备

    Oracle9i的init.ora参数中文说明

    Oracle9i初始化参数中文说明 Blank_trimming: 说明: 如果值为TRUE, 即使源长度比目标长度 (SQL92 兼容) 更长, 也允许分配数据。 值范围: TRUE | FALSE 默认值: FALSE serializable: 说明: 确定查询是否获取表级...

    Oracle中Clob类型处理解析收藏

    最近利用NHibernate映射类型为Clob字段在插入数据时发现当字符的字节数(一个半角字符一个字节,一个全角字符两个字节)在2000-4000之间时报错(ORA-01461:仅可以插入LONG列的LONG值赋值)。经过不断查找资料和自己...

    Oracle升级迁移实战文章和方案文档汇总-共168篇.xlsx

    OGG能够复制迁移包含CLOB字段的table? Oracle数据库迁移从Windows到Linux Oracle数据库迁移从Windows到Linux 18小时停机时间完成230TB数据从AIX到Linux的迁移 数据库-Oracle11gR2-RAC-with-ASM存储迁移 PDB迁移和...

    Oracle数据库恢复工具Oracle Database Unloader(ODU)3.09

    支持的数据类型包括:NUMBER, CHAR, VARCHAR2, NCHAR,NVARHCAR2, LONG, DATE, RAW, LONG RAW, BLOB, CLOB, TIMESTAMP (9i+) , BINARY FLOAT, BINARY DOUBLE (10g+) 导出的数据格式包括纯文本和DMP文件两种。以纯...

    PRM-DUL Oracle(数据库恢复工具) v4.1.zip

    可在多个操作平台(AIX/HPUX/SOLARIS/Linux/Windows)使用并支持对Oracle 9i/10g/11g/12c各版本数据库的数据救援工作。软件基于JAVA 开发,绿色无需安装,图形化操作界面,易于上手使用。可基于单数据文件操作或...

    最全的oracle常用命令大全.txt

    启动oracle9i数据库命令: $ sqlplus /nolog SQL*Plus: Release 9.2.0.1.0 - Production on Fri Oct 31 13:53:53 2003 Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved. SQL&gt; connect / as ...

    oracle数据库修复

    支持的数据类型包括:NUMBER, CHAR, VARCHAR2, NCHAR,NVARHCAR2, LONG, DATE, RAW, LONG RAW, BLOB, CLOB, TIMESTAMP (9i+) , BINARY FLOAT, BINARY DOUBLE (10g+) 全面支持LOB字段: 支持CLOB、NCLOB和BLOB CLOB...

    赤兔Oracle数据库恢复软件 v11.6.zip

    6.全面支持LOB字段:支持CLOB、NCLOB和BLOBCLOB,支持Big Endian和Little Endian字节序 7.支持LOB分区,子分区 8.支持同一个表中,不同LOB列使用不同CHUNK SIZE的情况 9.CLOB数据可以导出到与其他列相同的文件中...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 第一章 Oracle入门 一、 数据库概述 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今五十年前。简单来说是本身可视...

    orcale常用命令

    启动oracle9i数据库命令: $ sqlplus /nolog SQL*Plus: Release 9.2.0.1.0 - Production on Fri Oct 31 13:53:53 2003 Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved. SQL&gt; connect / as ...

    ssh(structs,spring,hibernate)框架中的上传下载

     由于我们的数据库是Oracle9i,所以使用OracleLobHandler。  在配置完LobHandler后, 还需要将其注入到sessionFactory的Bean中,下面是调用后的sessionFactory Bean的配置:  代码 6 将lobHandler注入到...

    Oracle事例

    20.oracle8中扩充了group by rollup和cube的操作。有时候省了你好多功夫的。 下面的语句可以进行总计 select region_code,count(*) from aicbs.acc_woff_notify group by rollup(region_code); &lt;2&gt; 对第1个字段...

Global site tag (gtag.js) - Google Analytics