Как получить порядковый номер только что вставленной строки?
Oracle: Как получить порядковый номер только что вставленной строки?
Ответ 1
insert... return.
declare
s2 number;
begin
insert into seqtest2(x) values ('aaa') returning seq into s2;
dbms_output.put_line(s2);
end;
"seq" здесь относится к имени столбца, значение которого вы хотите сохранить в переменной s2.
в python:
myseq=curs.var(cx_Oracle.NUMBER)
curs.prepare("insert into seqtest2(x) values('bbb') returning seq into :x")
curs.execute(None, x=myseq)
print int(myseq.getvalue())
Ответ 2
Изменить:, как отметил Марк Харрисон, это предполагает, что вы контролируете, как создается идентификатор вашей вставленной записи. Если у вас есть полный контроль и ответственность за это, это должно сработать...
Используйте хранимую процедуру для выполнения вставки и возврата идентификатора.
например: для таблицы имен с идентификаторами:
PROCEDURE insert_name(new_name IN names.name%TYPE,
new_name_id OUT names.id%TYPE)
IS
new_id names.id%TYPE;
BEGIN
SELECT names_sequence.nextVal INTO new_id FROM dual;
INSERT INTO names(id, name) VALUES(new_id, new_name);
new_name_id := new_id;
END;
Использование хранимых процедур для операций CRUD является хорошей идеей, независимо от того, используете ли вы уровень ORM, поскольку он делает ваш код более агрегированным по базе данных, помогает против инъекций и т.д.
Ответ 3
Мой ответ на С#, учитывая, что таблица "testtable" имеет столбец "ID" в виде PK с последовательностью автосинхронов, а поле "testname" - это поле varchar.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Oracle.DataAccess.Client;
using System.Data;
namespace ConsoleApplication3
{
class Program
{
public static void Main(string[] args)
{
OracleConnection cn = new OracleConnection("your connection string here");
string sql = "INSERT INTO testtable(testname) VALUES('testing2') RETURNING id INTO :LASTID";
OracleParameter lastId = new OracleParameter(":LASTID", OracleDbType.Int32);
lastId.Direction = ParameterDirection.Output;
using (OracleCommand cmd = new OracleCommand(sql, cn))
{
cn.Open();
cmd.Parameters.Add(lastId);
cmd.ExecuteNonQuery();
Console.WriteLine("Last ID: " + lastId.Value.ToString());
cn.Close();
}
Console.WriteLine();
Console.ReadKey(false);
}
}
}