2016-04-16 8 views
0

Ich arbeite zum ersten Mal mit OCI, also könnte dies eine grundlegende Frage sein .... Ich komme aus MySql Wort .... Using VS2012 mit C++.OCI ruft Daten ab, ohne die Tabellenstruktur zu kennen

Ich möchte eine einfache SELECT-Anweisung mit einigen Variationen auf WHERE und LIMIT-Klausel machen. Die SQL-Abfrage wird dynamisch von einem C++ geschriebenen Prozessor erstellt, und die Anweisung wird von diesem Modul bereitgestellt. So kann ich so etwas wie:

SELECT * FROM MYTABLE3; oder

SELECT F1, F2, F3 FROM MYTABLE1; oder sogar

SELECT F1, F3, F4 FROM MYTABLE2 WHERE ID > 10; 

keine große Sache hier.

Mein Problem ist, dass ich nicht im Voraus das TABLE FORMAT kennen, so kann ich Variablen nicht daran binden, bevor Sie die Anweisung ausführen und die Tabellenstruktur abrufen. In MySql ist das ganz einfach, weil ich die Anweisung ausführe und das resultSet bekomme. Aus dem resultSet kann ich die Anzahl der abgerufenen Spalten, den Namen, das Datenformat und die Größe jeder Spalte überprüfen. Nach dem Lesen dieser Daten baue ich eine dynamische Matrix mit der Tabellenstruktur und ihren Daten, mein endgültiges Ziel. Etwas wie:

sql::ResultSetMetaData *resultMeta = resultSet->getMetaData(); 

    while (resultSet->next()) 
    { 
     for (unsigned int i = 1; i <= resultMeta->getColumnCount(); i++) 
     { 
      std::string label = resultMeta->getColumnLabel(i); 
      std::string type = resultMeta->getColumnTypeName(i); 
      // ... Get the resultset attributes and data 
     } 

     retData.push_back(data); 
    } 

Von dem, was Ive in Oracle gesehen, ich brauche die Variablen zu binden, die vor zurückgegeben werden gehen, um die Ausgabe der ausführen/Abrufoperationen. In meinem Fall kann ich das nicht, weil ich die Tabellenstruktur nicht im Voraus kenne ...

Ich bin mir ziemlich sicher, dass Oracle das kann, ich weiß einfach nicht, wie ich es machen soll. Ich habe die Oracle Docs gelesen und habe keine Hinweise darauf gefunden ....

Hilfe wird sehr geschätzt und Codebeispiele auch. Ich stehe jetzt seit 2 Tagen fest ... Danke, dass du geholfen hast.

Antwort

0

Können Sie bitte Folgendes auf Ihrem Kontoauszug (stmhp) versuchen. Dies gibt Ihnen die Anzahl der Spalten in Ihrer Oracle-Anweisung.

err = OCIAttrGet ((dvoid *) stmhp, (UB4) OCI_HTYPE_STMT, (dvoid *) & parmcnt, (UB4 *) 0, (UB4) OCI_ATTR_PARAM_COUNT, errhp);

Bitte überprüfen Sie auch diesen Link, der Ihnen hilft, den Datentyp jeder Spalte im Resultset herauszufinden.

Retrieving data type information for columns in an Oracle OCCI ResultSet

Verwandte Themen