Как вызвать хранимую процедуру с параметром типа table

Я хотел бы позвонить хранимая процедура, это имеет параметр типа TABLE.
Как я могу сделать это с помощью OCCI (11g1) в приложении Windows C ++?

Вот определение хранимой процедуры:

  FUNCTION am_send(
p_caFnr                   IN       VARCHAR2,
p_TabBgr                  IN       DSKS_BGR_TAB,
p_caTextout               OUT      VARCHAR2)
RETURN NUMBER;

и используемые типы:

create or replace
TYPE      DSKS_BGR_TAB,
AS TABLE OF DSKS_BGR

create or replace
TYPE      DSKS_BGR
(BgrNr    VARCHAR2(3),
TrId     VARCHAR2(8))

Что я сделал до сих пор:

Я создал объектное представление типа DSKS_BGR используя OTT Utility.

Мой код до сих пор:

Environment* env = Environment::createEnvironment(Environment::OBJECT);

try
{
Connection *con = env->createConnection("xxxxx", "xxxxx", "xxxxx");

Statement* statement = con->createStatement("BEGIN :1 := am_send(:2, :3, :4); END;");

statement->registerOutParam(1, OCCINUMBER);
statement->setString(2, "Test");
// ?? DSKS_BGR_TAB
statement->registerOutParam(4, OCCISTRING, 1000);

statement->execute();

int result = statement->getNumber(1);
string textOut = statement->getString(4);

env->terminateConnection(con);
}
catch(const SQLException &exc)
{
cout << exc.getErrorCode() << exc.getMessage();
}

Environment::terminateEnvironment(env);

Я понятия не имею, как установить TABLE параметр.

6

Решение

Вы почти там!

  1. Создайте объектные представления ваших типов оракула, используя Утилита типа объекта Translator OTT

  2. Создать vector указателей на созданный тип OTT и использовать вызов OCCI setVector() на заявлении

  3. Execute!

Вот небольшой пример кода:

#include <occi.h>
#include <iostream>
#include "RegisterMappings.h"
using namespace oracle::occi;
using namespace std;

void callproc(Connection *con)
{
vector<my_obj_t *> vect;
int i;
for (i=0; i<10; i++)
{
my_obj_t *obj = new my_obj_t();
obj->setid(i);
obj->setname("TEST");
vect.push_back(obj);
}
cout << "\ncallproc - invoking a PL/SQL procedure with parameters"  << endl;
Statement *stmt = con->createStatement("BEGIN my_proc(:1); END;");
cout << "\nExecuting the block :" << stmt->getSQL() << endl;
setVector(stmt, 1, vect, "MY_OBJ_TAB_T");
stmt->execute();
con->terminateStatement (stmt);

cout << "\nocciproc - done" << endl;

// delete allocated memory
for (i=0; i<10; i++)
{
delete vect[i];
}
}
// end of callproc ()
int main()
{
try {
Environment* env = Environment::createEnvironment(Environment::OBJECT);
RegisterMappings(env);
Connection* conn = env->createConnection("scott","tiger");
callproc(conn);   conn->commit();
env->terminateConnection(conn);
Environment::terminateEnvironment(env);
}
catch(SQLException &ex)
{
cout << ex.getMessage() << endl;
}
}
8

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]