如何使用table类型的参数调用存储过程

时间:2014-04-03 12:45:59

标签: c++ oracle oracle11g occi

我想调用存储过程,其参数类型为TABLE
如何在Windows C ++应用程序中使用OCCI(11g1)执行此操作?

以下是存储过程的定义:

  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))

到目前为止我做了什么:

我使用OTT Utility创建了DSKS_BGR类型的对象表示。

到目前为止我的代码:

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参数。

1 个答案:

答案 0 :(得分:8)

你快到了!

  1. 使用对象类型转换器实用程序 OTT

  2. 创建oracle类型的对象表示
  3. 创建指向OTT创建类型的vector指针,并在声明中使用OCCI调用setVector()

  4. Execute <!/ p>

  5. 这是一个小代码示例:

    #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;
        }
    }