Возврат "Таблица номера (7)" и т. Д. Из хранимой процедуры Oracle с OCCI - PullRequest
0 голосов
/ 25 июня 2019

Из 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); 
}
...