`
iihero
  • 浏览: 259595 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

OCI几个小问题

阅读更多
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
分享到:
评论

相关推荐

    oracle11.2_oci

    5. **错误处理**:如果在使用oci.dll时遇到问题,比如“找不到oci.dll”或“不支持的版本”,可能是因为版本不匹配或环境变量设置不正确。 总的来说,Oracle 11.2 OCI和其相关的Instant Client 11.2是开发和管理...

    oci.dll 文件

    在处理oci.dll相关问题时,用户需要确保以下几个关键点: 1. 下载oci.dll文件的来源安全可靠,避免下载带有病毒的文件。 2. 选择与操作系统和Oracle版本相匹配的oci.dll文件,因为不同的操作系统(如Windows 32位或...

    64位 OCI.DLL

    在64位系统中,为了确保应用程序能够正确调用oci.dll,需要确保以下几个关键点: - 确保Oracle客户端或Instant Client已安装,并且是64位版本。 - 检查oci.dll文件是否位于系统路径中正确的目录下,通常是Oracle...

    oracle11g x64 oci.dll

    当遇到oci.dll无法加载的问题时,可能的原因有以下几点: 1. **缺失或不兼容的oci.dll**:确保你已经下载并安装了适用于64位环境的Oracle Instant Client。oci.dll文件应与你的应用程序和操作系统架构匹配。 2. **...

    Oracle Spatial OCI源码

    这些文件可能涵盖了以下几个方面的内容: 1. **数据结构**:源码可能会定义一系列数据结构,如几何对象(点、线、面)、空间索引结构(R树、B树等)和空间参考系统(坐标转换)等。 2. **API函数**:包含了一系列...

    windows系统oci.dll

    要解决oci.dll相关问题,你可以采取以下几种方法: 1. **重新安装Oracle客户端**:如果你遇到oci.dll缺失的错误,最直接的解决方案是重新安装Oracle客户端软件,确保所有必要的文件都被正确地安装到系统中。 2. **...

    Navicat_12.1.0.2.0_Oracle_OCI.dll

    在提供的压缩包文件中,除了Oracle_OCI.dll之外,还有其他几个重要的Oracle客户端库文件: 1. oraociei12.dll:Oracle Client Interface,是Oracle客户端的核心库,用于处理与Oracle服务器的通信。 2. orannzsbb12....

    oci.dll oracle 12

    - 如果遇到oci.dll缺失或版本不匹配的问题,可能需要更新或重新安装Oracle Instant Client。 - 对于64位系统,需要同时设置32位和64位的oci.dll路径,因为某些应用程序可能需要32位版本的oci.dll。 总之,oci.dll是...

    OCI 在 vc中

    一个简单的OCI程序结构通常包括以下几个步骤: 1. **初始化OCI环境**:通过`OCIEnvCreate`函数创建OCI环境。 2. **分配错误句柄**:使用`OCIHandleAlloc`为环境句柄分配错误句柄。 3. **建立数据库连接**:使用`...

    oci数据库客户端缺失文件

    oci.dll文件的缺失可能有以下几个原因: 1. **安装不完整**:在安装Oracle数据库客户端或相关应用程序时,如果安装过程出现了错误或中断,可能导致oci.dll文件没有被正确地复制到系统路径下。 2. **文件损坏或被...

    C#调用oci直连Oracle

    8. **兼容性和版本问题**:oci.dll与Oracle数据库版本之间存在兼容性,需要确保oci.dll版本与数据库服务器版本相匹配。 总的来说,C#通过oci.dll直连Oracle是一种可行但较为底层的方法,适用于特定场景,如服务器...

    32和64位最全oracle ocidll文件

    "32和64位最全Oracle OCIDLL文件"这个压缩包集合了所有版本的Oracle OCIDLL文件,确保无论你的系统是32位还是64位,都可以找到合适的版本来解决相关问题。特别地,这个集合可能包括oci.dll、oci11.dll、oci12c.dll等...

    开源数据库抽象接口oci

    oci接口主要包含了以下几方面的功能: 1. **连接管理**:oci提供了连接数据库的功能,包括建立、断开和重用数据库连接。通过oci,开发者可以创建会话(session),管理事务,并处理登录和登出过程。 2. **SQL和PL/...

    php php_oci8_11g.dll php_oci8_11g.pdb

    要使用oci扩展,你需要确保以下几个步骤已正确完成: 1. **安装和配置Oracle客户端**:在你的服务器上,你需要安装Oracle Instant Client,这是PHP连接Oracle数据库的基础。根据你的操作系统选择合适的版本,并将其...

    Qt5.3.1+OCI驱动

    这通常涉及以下几个步骤: 1. **安装Oracle客户端**: 首先,你需要在开发环境中安装Oracle客户端,因为它包含了必要的OCI库和头文件。 2. **配置Qt构建系统**: 在Qt的配置阶段,需要指定Oracle的包含目录和库路径...

    Oracle Call Interface_oci

    使用OCI进行编程时,有几个关键步骤是必需的: 1. **环境配置**:在开发之前,需要正确配置Oracle客户端库,确保应用程序能够找到并加载OCI库。 2. **连接建立**:使用OCI函数oci_connect()或oci_newconnect()建立...

    delphi 通过oci连接oracle数据库

    Delphi的OCI连接通常涉及以下几个步骤: 1. **配置环境**:确保已安装Oracle客户端,包含所需的OCI库文件。这些库通常位于Oracle安装目录下的`oci.dll`和`oraociei12.dll`等文件。 2. **导入OCI库**:在Delphi项目...

    oci_class--oracle oci c++ class and example

    oci_class 的核心功能可能包括以下几点: 1. **连接管理**:oci_class可能提供了建立、断开与Oracle数据库的连接的方法。通过输入数据库的服务器名、服务名、用户名和密码,开发者可以创建一个数据库连接对象,用于...

    OCI连接oracle数据库(c++)实现

    为了在C++中使用OCI连接Oracle数据库,你需要完成以下几个步骤: 1. **环境配置**:确保已安装Oracle客户端库,这些库包含必要的头文件和动态链接库,用于编译和运行OCI程序。此外,还需要设置环境变量,如`LD_...

Global site tag (gtag.js) - Google Analytics