我们维护了一系列用C ++编写的组件,这些组件在Linux,Solaris,AIX和HP / UX下运行,使用Pro * C连接到Oracle数据库。我即将编写一个执行大量动态SQL的组件,并希望使用OCCI来实现该功能。我们所有组件的基类使用相当普通的Pro * C创建与数据库的连接:
EXEC SQL CONNECT :user IDENTIFIED BY :password AT :alias USING :name;
所有未来的Pro * C代码都使用alias
与数据库进行交互。
是否有可能从此获得OCCI连接,以便我可以保持基类实现不变但在我的组件中使用OCCI?
答案 0 :(得分:1)
tl; dr:你不能重用与OCCI的Pro * C连接,但是is supported可以重用OTL连接。
Pro * C运行时库在内部使用OCI API。 Oracle记录了如何获取当前使用的OCI句柄:
预编译器应用程序可以提取OCI句柄并直接调用OCI函数。但是,不支持非阻塞模式,因为预编译器无法处理可能返回的“仍在执行”的错误。 (Oracle的Pro*C Programmer's Guide,11.2g)
您可以在嵌入式CONNECT语句后获取OCI句柄。
有关详细信息,请参阅SQLEnvGet()
/ SQLSvcCtxGet()
函数。
虽然OCCI也在内部使用OCI,但它没有提供任何方法来“从现有的OCI句柄开始”。一旦与OCCI连接,它只提供获取其OCI句柄的方法。
与OCCI相比,OTL allows you to start from an existing OCI handle。与OCCI类似,它为C ++中的动态SQL提供了方便的API。此外,与OCCI不同,它只是头文件(不再是C ++编译器/ STL问题),开源,可移植,其API比OCCI更好。因此,如果您希望在比OCI / Pro * C更高的级别上与Oracle进行交互,那么它可以说是比OCCI更好的选择。