Из C ++ с использованием OCCI, как я могу получить и перебрать выходные данные хранимой процедуры Oracle PL / SQL, которая возвращает данные как «TABLE of NUMBER (7)» или «TABLE of VARCHAR2 (100)» и т. Д.? Я не нашел четкого примера или документации, которая детализирует доступ к данным, возвращенным в виде таблиц.
Я использую MS VC9 ++ (VS2008 SP1) с 32-битным клиентом Oracle 11.2 Instant. На данный момент мне нужно придерживаться этих версий, чтобы не рисковать нарушением компиляции гораздо более крупного проекта с большим количеством устаревшего оборудования и драйверов. Я перепробовал много вариантов, которые не компилируются или дают ошибки во время выполнения. Запуск OTT оказался проблематичным, так как определения TYPE существуют только при запуске процедуры.
В настоящее время я использую интерфейс OCCI, но я открыт для использования C ++ .net, если он будет сосуществовать с текущим кодом C ++.
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);
}