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,显然效率非常低,期待好的做法




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值