Oracle:如何获取刚刚插入的行的序列号?
Posted
技术标签:
【中文标题】Oracle:如何获取刚刚插入的行的序列号?【英文标题】:Oracle: How do I get the sequence number of the row just inserted? 【发布时间】:2008-12-11 22:49:36 【问题描述】:如何获取刚刚插入的行的序号?
【问题讨论】:
【参考方案1】:插入...返回。
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】:编辑: 正如 Mark Harrison 所指出的,这假设您可以控制插入记录的 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 操作使用存储过程都是一个好主意,因为它使您的代码更加与数据库无关,有助于防止注入攻击等等。
【讨论】:
【参考方案3】:我在 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);
【讨论】:
以上是关于Oracle:如何获取刚刚插入的行的序列号?的主要内容,如果未能解决你的问题,请参考以下文章
TSQL获取刚刚插入的行的SQL Autonumber ID