如何获取刚刚插入的行的序列号?
插入...返回.
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())
编辑:正如马克哈里森指出的那样,这假设您可以控制如何创建插入记录的ID.如果你对它有完全的控制和责任,这应该有效......
使用存储过程执行插入并返回id.
例如:对于带有ID的名称表:
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;
无论您是否使用ORM层,使用存储过程进行CRUD操作都是一个好主意,因为它使您的代码更加与数据库无关,有助于防止注入攻击等.
我在C#中的答案,考虑到表"testtable"有一个"ID"列作为带有autoinc序列的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); } } }