sql - 插入 Oracle 并检索生成的序列 ID

标签 sql oracle stored-procedures identity-column scope-identity

我有一些针对 SQL Server 的原始 SQL 查询,它们使用 SCOPE_IDENTITY 来检索特定 INSERT 的生成 ID,在该 INSERT 发生在一次执行之后立即...

INSERT into Batch(
BatchName,
BatchType,
Source,
Area
) Values (
@strBatchName,
@strType,
@strSource,
@intArea
);

SELECT SCOPE_IDENTITY() BatchID;

问题是:

对于 Oracle 数据库,最好的方法是什么?

这可以通过标准 SQL 在 Oracle 上完成,还是我必须切换它以使用存储过程并将类似的东西放在存储过程的主体中?

如果它必须是一个存储过程,那么检索最后生成的序列号的事实上的标准方法是什么,注意考虑到多个线程上可能会有重叠的执行,所以这个机制需要检索正确的生成 ID 和不一定是最后生成的绝对 ID。

如果两个同时执行,则每个都必须从各自的调用中返回正确的生成 ID。请注意,由于调用的多线程性质,我没有使用 SQL Server 的“@@IDENTITY”。

如果可能的话,我宁愿将它保留为原始 SQL,因为这对我来说更容易跨平台管理(包含每个平台的 SQL block 的单个文件,由 DBMS 标识标签分隔)。存储过程对我来说需要更多的工作来管理,但如果这是唯一可能的方式,我可以这样做。

最佳答案

您可以使用以下语句将插入的 Id 获取为类似变量的事物。

INSERT INTO  YOUR_TABLE(ID) VALUES ('10') returning ID into :Inserted_Value;

现在您可以使用以下语句检索值
SELECT :Inserted_Value FROM DUAL;

关于sql - 插入 Oracle 并检索生成的序列 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5558979/

相关文章:

php - 从表中选择数据,其中 COUNT 列从最大到最小

SQL select 语句 union all with itself

mysql - 从 MySql 存储过程中连接到远程主机

mysql - 根据给定的数组集动态替换结果值

mysql - 如何使无引号、逗号分隔的 ID 列表适用于 MySQL 中的 IN 子句

java - Prepared Statement 不检索 sql 的确切结果

php - oracle中的日期类型不包含时间值

.net - SQL Server 存储过程引发多个错误

sql - 使用Intellisense开发MySQL存储过程?

mysql - 如何在sql中选择2个表但不重复?