oracle clog读取 php,OCI访问Oracle的一些刁钻问题

这篇博客介绍了在Oracle OCI中处理LOB(大型对象)的两种不同方法,包括预处理SQL语句、使用OCILobCreateTemporary函数等步骤。同时,博主解决了在插入空字符串时遇到的问题,并分享了如何通过IP和端口指定连接Oracle数据库的自定义SID方法。
摘要由CSDN通过智能技术生成

1、CLOG/BLOG的插入

找了很多OCI的例子以及一些PHP的例子,基本上都是同一种做法:

a、OCIStmtPrepare预处理SQL语句:"insert into mytable (myimg) values (empty_blob()) returning myimg into :pImg"

b、调用OCIDescriptorAlloc,用参数OCI_DTYPE_LOB,获得一个LOB的句柄

c、用OCIStmtBindByPos或者OCIStmtBindByName,把LOB句柄和参数:pImg绑定

d、OCIStmtExecute执行

e、OCILobWrite往LOB里面写数据

f、commit和释放资源等等

问题是这个SQL语句也太特别了,和其他数据库的SQL不一样。但是在java的实现中,并不需要这么奇怪的语法。

insert into mytable (myimg) values(?)

就足够了。

在我们的应用中,能够统一同一种SQL的写法当然是最好的,最好就是:

insert into mytable (myimg) values (:pImg) 那就和其他的数据处理一致了。

做了很多的尝试,终于找到解决的方法:

a、OCIStmtPrepare预处理SQL语句:"insert into mytable (myimg) values (:pImg)"

b、调用OCIDescriptorAlloc,用参数OCI_DTYPE_LOB,获得一个LOB的句柄

c、通过OCILobCreateTemporary函数,为LOB句柄创建临时LOB对象

d、OCILobWriteAppend往LOB句柄写数据

e、用OCIStmtBindByPos或者OCIStmtBindByName,把LOB句柄和参数:pImg绑定

f、OCIStmtExecute执行

g、commit和释放资源等等

经过简单的封装,LOB操作简单很多了:

TDBConnection conn = TDatabase::getConnection( strConnection );

TDBStatement dbStatement(conn.getStatement());

dbStatement.prepareSQL( "insert into mytable (myimg) values (:pImg)" );

dbStatement.getParam("pImg").attachInputStream( fStream );

dbStatement.execSQL();

conn.commite();

2、空字符串

插入一个空字符串,OCIBindByPos/OCIBindByName的时候,那个字符串的数据类型,不能是SQLT_LVC,用SQLT_CHR倒是没有问题。

具体为什么,只有Oracle自己知道了。

3、指定IP连接Oracle

通过OCIServerAttach里面指定绑定的SID连接数据库。用SID连接Oracle当然有它的好处。奇怪的是JDBC能用IP和Port指定连接哪个Oracle。

找遍OCI的帮助都找不到IP连接方法。google了很久,找到解决的方法,自己生成SID:

string strSID = "(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=%1)(PORT=%2)))(CONNECT_DATA=(SERVICE_NAME=%3)))";

里面的%1设为Oracle服务器的IP;%2设为Oracle服务器的Port,一般是1521;%3就是database的名字。

把这个字符串放入OCIServerAttach

posted on 2006-04-14 22:24 cyt 阅读(3901) 评论(3)  编辑 收藏 引用 所属分类: Work

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值