Лениво переписывать, привожу свою реализацию:
function insertObject($object,$table) {
$clobs_n = "";
$clobs_i = "";
$sql = "INSERT INTO " . $this->prefix.$table . " (";
$values = ") VALUES (";
// возвращает массив с данными о полях таблицы
// выполняется запрос SELECT colno,
// LOWER (cname) AS field,
// LOWER (coltype) AS type,
// width AS length,
// precision AS lengthvar,
// LOWER (nulls) AS notnull,
// defaultval AS defaultval
//FROM col
//WHERE LOWER (tname) = LOWER ('" . $this->prefix . $table . "')
$dd = $this->getDataDefinition($table);
foreach (get_object_vars($object) as $var=>$val) {
$qvar = $this->quote_fname($var);
$sql .= $qvar . ",";
if ($dd[$var]['DB_REAL_TYPE'] == "clob"){
$values .= " EMPTY_CLOB(),";
$clobs_n .= $qvar .",";
$clobs_i .= ":".$qvar .",";
}else {
$values .= "'".str_replace("'","''",$val)."',";
}
}
if ($clobs_n != "") $cr = " RETURNING ".substr($clobs_n,0,-1)." INTO " . substr($clobs_i,0,-1);
else $cr = "";
$stmt = OCIParse($this->connection, substr($sql,0,-1).substr($values,0,-1) . ")".$cr);
$this->trace(substr($sql,0,-1).substr($values,0,-1) . ")".$cr);
foreach (get_object_vars($object) as $var=>$val) {
if ($dd[$var]['DB_REAL_TYPE'] == "clob"){
$qvar = $this->quote_fname($var);
${$qvar} = OCINewDescriptor($this->connection, OCI_D_LOB);
OCIBindByName($stmt, ":" . $qvar, ${$qvar}, -1, OCI_B_CLOB);
}
}
@OCIExecute($stmt, OCI_DEFAULT);
foreach (get_object_vars($object) as $var=>$val) {
if ($dd[$var]['DB_REAL_TYPE'] == "clob"){
$qvar = $this->quote_fname($var);
${$qvar}->save($val);
${$qvar}->free();
}
}
$this->checkError($stmt);
OCICommit($this->connection);
OCIFreeStatement($stmt);
// здесь собственно и возвращается id
// производится запрос к последовательности
if ($this->in_error == false){
$sql = "SELECT " . $table ."_ids.currval last_value FROM DUAL";
$stmt = @$this->ora_query($sql);
if (is_resource($stmt)) $e = @OCIerror($stmt);
if (empty($e)) {
$e = @OCIerror($this->connection);
if ($e === false) $e = @OCIError();
if ($e === false){
while (OCIFetch($stmt)) {
$last_value = OCIResult($stmt, "LAST_VALUE");
OCIFreeStatement($stmt);
return $last_value;
}
}
}
}
return 0;
}