Ich schreibe einen C++ Code, der irgendwann die ID der zuletzt eingefügten Zeile bekommen muss.Oracle OCI bekomme ID der zuletzt eingefügten Zeile
Basierend auf this link here habe ich diesen Code, aber es ist nur Müll (ungültige Zeichen) Rückkehr:
std::string sql = "INSERT INTO MYTABLE (FIELD_A, FIELD_B) VALUES (10, 20)";
OCIStmt *stmthp;
int sts = OCIHandleAlloc((dvoid *) envhp, (dvoid **) &stmthp, OCI_HTYPE_STMT, (size_t) 0, (dvoid **) 0);
CheckOracleError(sts);
sts = OCIStmtPrepare(stmthp, errhp, (const OraText *) sql.c_str(), (ub4) sql.size(), (ub4) OCI_NTV_SYNTAX, (ub4) OCI_DEFAULT);
CheckOracleError(sts);
sts = OCIStmtExecute(svchp, stmthp, errhp, (ub4) 1, (ub4) 0, (CONST OCISnapshot *) NULL, (OCISnapshot *) NULL, OCI_COMMIT_ON_SUCCESS);
if (sts != OCI_NO_DATA && sts != OCI_SUCCESS)
CheckOracleError(sts);
OraText rowID[19]; // Extra char for null termination.
ub2 size = 18;
OCIRowid *pRowID;
std::memset(rowID, 0, 19); // Set to all nulls so that string will be null terminated.
OCIDescriptorAlloc(envhp, (void**)&pRowID, OCI_DTYPE_ROWID, 0, NULL);
OCIAttrGet(stmthp, OCI_HTYPE_STMT, pRowID, 0, OCI_ATTR_ROWID, errhp);
OCIRowidToChar(pRowID, rowID, &size, errhp);
OCIHandleFree(stmthp, OCI_HTYPE_STMT);
Irgendwelche Ideen auf, wie man es beheben?
'ROWID' ist eine [Pseudospalte von Oracle generiert] (https://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns008.htm) und ist ** NICHT ** ein Primärschlüssel für die Tabelle, wie sie geändert werden kann, wenn die Daten gelöscht und neu eingegeben werden oder wenn die Zeilenbewegung aktiviert ist. Sie sollten einen Primärschlüssel für Ihre Tabelle haben, der vorzugsweise von einer Sequenz generiert wird, oder in 12c eine Identitätsspalte. – MT0
Hummm. Ich habe es .... Eigentlich ** ICH HABE ** einen Primärschlüssel namens * ID *, die von einer Sequenz generiert wird. Ich muss diese ID aus der letzten eingefügten Zeile holen, nicht die ROWID .... Wie soll ich das machen? – Mendes