场景描述:
将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,显然效率非常低,期待好的做法
分享到:
相关推荐
oracle9.2.0.5以前的版本导出带有BLOB,CLOB等大字段的时候会报错,oracle9.2.0.5以后的版本不会出现此错误。oracle9.2.0.5以前的版本导出带有BLOB,CLOB等大字段的时候会报错解决办法:
是处理wm_concat中以varchar处理合并列字段过小。 clob 可以加大处理。 oracle 9I oracle 10G 必备
Oracle9i初始化参数中文说明 Blank_trimming: 说明: 如果值为TRUE, 即使源长度比目标长度 (SQL92 兼容) 更长, 也允许分配数据。 值范围: TRUE | FALSE 默认值: FALSE serializable: 说明: 确定查询是否获取表级...
最近利用NHibernate映射类型为Clob字段在插入数据时发现当字符的字节数(一个半角字符一个字节,一个全角字符两个字节)在2000-4000之间时报错(ORA-01461:仅可以插入LONG列的LONG值赋值)。经过不断查找资料和自己...
OGG能够复制迁移包含CLOB字段的table? Oracle数据库迁移从Windows到Linux Oracle数据库迁移从Windows到Linux 18小时停机时间完成230TB数据从AIX到Linux的迁移 数据库-Oracle11gR2-RAC-with-ASM存储迁移 PDB迁移和...
支持的数据类型包括:NUMBER, CHAR, VARCHAR2, NCHAR,NVARHCAR2, LONG, DATE, RAW, LONG RAW, BLOB, CLOB, TIMESTAMP (9i+) , BINARY FLOAT, BINARY DOUBLE (10g+) 导出的数据格式包括纯文本和DMP文件两种。以纯...
可在多个操作平台(AIX/HPUX/SOLARIS/Linux/Windows)使用并支持对Oracle 9i/10g/11g/12c各版本数据库的数据救援工作。软件基于JAVA 开发,绿色无需安装,图形化操作界面,易于上手使用。可基于单数据文件操作或...
启动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> connect / as ...
支持的数据类型包括:NUMBER, CHAR, VARCHAR2, NCHAR,NVARHCAR2, LONG, DATE, RAW, LONG RAW, BLOB, CLOB, TIMESTAMP (9i+) , BINARY FLOAT, BINARY DOUBLE (10g+) 全面支持LOB字段: 支持CLOB、NCLOB和BLOB CLOB...
6.全面支持LOB字段:支持CLOB、NCLOB和BLOBCLOB,支持Big Endian和Little Endian字节序 7.支持LOB分区,子分区 8.支持同一个表中,不同LOB列使用不同CHUNK SIZE的情况 9.CLOB数据可以导出到与其他列相同的文件中...
oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 第一章 Oracle入门 一、 数据库概述 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今五十年前。简单来说是本身可视...
启动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> connect / as ...
由于我们的数据库是Oracle9i,所以使用OracleLobHandler。 在配置完LobHandler后, 还需要将其注入到sessionFactory的Bean中,下面是调用后的sessionFactory Bean的配置: 代码 6 将lobHandler注入到...
20.oracle8中扩充了group by rollup和cube的操作。有时候省了你好多功夫的。 下面的语句可以进行总计 select region_code,count(*) from aicbs.acc_woff_notify group by rollup(region_code); <2> 对第1个字段...