2010-12-28 8 views
2

Dies ist meine erste Erfahrung so OCCI, also bitte ich um Entschuldigung, wenn die Antwort offensichtlich ist.Einfügen mehrerer Zeilen in eine Oracle-Datenbank mit OCCI

ich ein Statement-Objekt haben, erstellt die übliche Art und Weise:

string sqlStatement = "INSERT INTO data_tab VALUES(:id, :name, :number, :when)"; 
m_stmt = m_conn->createStatement(sqlStatement); 

m_stmt->setMaxIterations(100); 

Dann brauche ich eine Schleife über ein paar Objekte, die ich in die Datenbank einfügen sollte:

for(size_t i = 0; i < data.size(); ++i) 
{ 
    m_stmt->setInt(1, i); 

    try { 
     m_stmt->setString(2, data[i].client()); 
    } 
    catch(SQLException& e) 
    { 
     cerr << "setString(): " << e.what(); 
     exit(1); 
    } 

    m_stmt->setDouble(3, data[i].number()); 
    m_stmt->setDate(4, data[i].when()); 

    // ... 
    // Checks if maxIterations is lesser than data size, 
    // oteherwise calls executeUpdate and other kind of 
    // boilerplate code. 
    // ... 

    m_stmt->addIteration(); 
} 

aber der Code Borks in der setString-Methode mit der folgenden Ausgabe:

setString(): ORA-32132: maximum iterations cannot be changed 

Ich glaube, ich sollte diesen Fehler erhalten Ich rufe setMaxIterations nach einer setXXX-Methode auf, aber das mache ich nicht. Was mache ich falsch?

Antwort

2

sollten Sie setMaxParamSize() vor aufrufen, um eine variable Längenparameter zu setzen:

m_stmt->setMaxParamSize(2, 1000) // or whatever is the max length of your string. 
+0

Danke, ich würde das nie auf meiner eigenen finden. Würde es Ihnen etwas ausmachen, mir zu sagen, was dafür nötig ist? –

+2

@Vitor: Beim Vorbereiten der Iterationen ordnet 'Oracle'Client einen Puffer für das Array der Datensätze (der 'maxIterations'-Größe) zu und liest die Variablen einfach durch Versetzen des Arrays durch die Elementgröße in einer Schleife. Die Array-Elementgröße ist die Summe der Variablengröße und muss daher vorher bekannt sein. Dies kann dynamisch erfolgen, aber das bedeutet, dass das Array in Stücke von jeweils einem Datensatz (jede von seiner eigenen Größe) aufgeteilt wird und "setMaxIteractions (1)" hinter den Kulissen aufgerufen wird. – Quassnoi

Verwandte Themen