2014-04-03 27 views
5

bir parametresi olan bir saklı yordamını çağırmak için nasıl tip TABLE bir parametresi olan bir saklı yordam, çağırmak istiyorum.
Bunu, Windows C++ uygulamasında (11g1) kullanarak nasıl yapabilirim?
türü tablosunda

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

ve kullanılan türleri:

create or replace 
TYPE  DSKS_BGR_TAB, 
AS TABLE OF DSKS_BGR 

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

şimdiye kadar ne yaptım:

Ben yarattı Burada

saklı yordam tanımı var th kullanarak DSKS_BGR türünün nesne gösterimi e OTT Programı. Bugüne kadar

Kodum:

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

nasıl TABLE parametreyi ayarlamak için hiçbir fikrim yok.

cevap

7

Neredeyse varsın!

  1. OTT

  2. OTT göstergelerinden bir vector oluştur Nesne Türü Tercüman programını kullanarak oracle tiplerinin nesne temsillerini oluşturma türünü yarattı ve ekstresinde Occi çağrıyı setVector() kullanmak

  3. Execute! İşte

küçük bir kod örnektir:

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

Bir bellek sızıntısı olacak düşünüyorum - Eğer vektör her öğe için silme kullanarak belleği serbest bırakmak gerekir. Bunun iyi bir örnek olduğunu biliyorum, son zamanlarda bellek sızıntılarını çok fazla zaman harcadığım için sinir bozucu olduğum için üzgünüm:/ – user1645975

+0

@ user1645975: Kesinlikle haklısınız: Yukarıdaki örnekte bir bellek sızıntısı vardı. Yukarıdaki (resmi oracle) örnek kodu düzeltirim. –

+0

Evet, birkaç yıl önce bellek sızıntıları ve nasıl düşündüğüm hakkında hiçbir fikrim olmadığı zaman bu örnekleri hatırlıyorum - "Burada bir hata olamaz, bu resmi bir örnek ..." – user1645975

İlgili konular