Пролучение insert id

psh

Guest
Пролучение insert id

Здравствуйте,
Каким способом можно получить ID только что добавленного сериал поля?
Заранее спасибо, psh.
 

psh

Guest
а каким либо други способом можно?
вот в mysql есть insert_id .. есть ли нечто похожее в Oracle?
 

psh

Guest
надо написать wrapper function для Oracle, которая озвращает последний insert_id.
Может быть можете дать совет как бы это сделать?
 

Falc

Новичок
psh

>>а каким либо други способом можно?
Это наиболее удобный способ, чем он не устраивает?
 

psh

Guest
может быть у кого-нибудь есть ф-ция, например DBinsert_id(..) {}
которая возврашает последний SEQ?

заранее спасибо. psh
 

Buteo

[CDR/DVP]
psh
Почитай про .CurrVal

но сразу учти, что нельзя делать .Сurrval, если в этой сессии ниразу не выполнялось .NextVal...
 

alxg

Новичок
Лениво переписывать, привожу свою реализацию:

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;
}
 
Сверху