3

We maintain an extensive collection of components written in C++ that run under Linux, Solaris, AIX and HP/UX that connect to an Oracle database using Pro*C. I am about to write a component that performs a lot of dynamic SQL and would like to implement that functionality using OCCI. The base class to all our components creates a connection to the database using the fairly normal Pro*C:

EXEC SQL CONNECT :user IDENTIFIED BY :password AT :alias USING :name;

And alias is used in all future Pro*C code to interact with the database.

Is it possible to get an OCCI connection from this so that I can leave our base class implementation intact but use OCCI in my component?

4

1 回答 1

1

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

Pro*C 运行时库在内部使用 OCI API。Oracle 记录了如何获取当前使用的 OCI 句柄:

预编译器应用程序可以提取 OCI 句柄并直接调用 OCI 函数。但是,不支持非阻塞模式,因为预编译器无法处理可能返回的“仍在执行”错误。(Oracle 的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 更好的选择。

于 2013-08-11T11:27:20.540 回答