从Pro*C连接获取OCCI连接



我们维护了大量用c++编写的组件,这些组件运行在Linux、Solaris、AIX和HP/UX下,使用Pro*C连接到Oracle数据库。我即将编写一个执行大量动态SQL的组件,并希望使用OCCI实现该功能。所有组件的基类使用相当普通的Pro*C:

创建到数据库的连接。
EXEC SQL CONNECT :user IDENTIFIED BY :password AT :alias USING :name;

并且alias将在以后的所有Pro*C代码中用于与数据库交互。

是否有可能从中获得OCCI连接,以便我可以保留我们的基类实现完整,但在我的组件中使用OCCI ?

tl;dr:您不能使用OCCI重用Pro*C连接,但是OTL支持连接重用。

Pro*C运行库内部使用OCI API。Oracle文档如何获取当前使用的OCI句柄:

预编译程序可以直接提取OCI句柄并调用OCI函数。但是,不支持非阻塞模式,因为预编译器无法处理可能返回的"仍在执行"错误。(Oracle’s Pro*C程序员指南,11.2g)

可以在嵌入的CONNECT语句后获取OCI句柄

参见SQLEnvGet()/SQLSvcCtxGet()函数

虽然OCCI也在内部使用OCI,但它不提供任何从现有OCI句柄"启动"的方法。它只在连接OCCI后提供获取OCI句柄的方法。

与OCCI相比,OTL允许您从现有的OCI句柄开始。与OCCI类似,它为c++中的动态SQL提供了方便的API。此外,与OCCI不同的是,它是头文件(没有更多的c++编译器/STL问题),开源,可移植,其API的设计比OCCI更好。因此,如果您想在比OCI/Pro* c更高的级别上与Oracle进行交互,它可以说是比OCCI更好的选择。

最新更新