如何从使用OCCI的C ++中捕获和迭代Oracle PL / SQL存储过程的输出结果,该结果将数据返回为“ NUMBER(7)表”或“ VARCHAR2(100)表”等?我还没有找到一个清晰的示例或文档来详细说明作为表返回的访问数据。 我将MS VC9 ++(VS2008 SP1)与Oracle 11.2 32位即时客户端一起使用。在这一点上,我需要停留在这些版本上,以免冒险破坏使用大量旧硬件和驱动程序进行的更大项目的编译。我尝试了许多无法编译的变体,或者给出了运行时错误。由于类型定义仅在过程运行时存在,因此运行OTT已证明是有问题的。 我目前正在使用OCCI界面,但是如果它可以与当前C ++代码共存,则愿意使用C ++ .net。
PL/SQL package definition
create or replace PACKAGE "CARRIERPKG" AS
TYPE tcarrier_site is TABLE of NUMBER(7) INDEX BY BINARY_INTEGER;
TYPE tpart_serial is TABLE of VARCHAR2(100) INDEX BY BINARY_INTEGER;
TYPE tpart_rtn_msg is TABLE of VARCHAR(200) INDEX BY BINARY_INTEGER;
PROCEDURE get_parts_v12
(p_carrier_serial IN phase2.carrier_site.carrier_serial_num%TYPE,
p_part_num IN phase2.part_info.PART_NUM%TYPE,
p_carrier_type IN phase2.carrier_type.id%TYPE,
carrier_site OUT NOCOPY tcarrier_site,
part_serial OUT NOCOPY tpart_serial,
rtn_msg OUT NOCOPY tpart_rtn_msg);
-------------- End PL/SQL procedure definition
//C++ Access using Oracle InstantClient 11p2 compiled with Microsoft Visual Studio 2008 SP1 as a 32-bit app
void Carrier::CAT_CarrierPkg()
{
Statement *stmt = con->createStatement();
try
{
stmt->setSQL("begin phase2.carrierpkg.get_parts_v12(:1, :2, :3, :4, :5, :6); end;");
stmt->setString(1, "189134075");
stmt->setString(2, "001050717");
stmt->setString(3, "CARGPA0007");
stmt->registerOutParam(4, OCCI???); // What OCCI type and how to iterate over returned data?
stmt->registerOutParam(5, OCCI???);
stmt->registerOutParam(6, OCCI???);
}
catch (SQLException& ex)
{
cout << ex.getMessage();
}
try
{
stmt->execute();
}
catch (SQLException& ex)
{
cout << ex.getMessage();
}
con->terminateStatement(stmt);
}