oracle 如何获取刚插入的序列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle 如何获取刚插入的序列相关的知识,希望对你有一定的参考价值。

序列程序如下:
create sequence SEQ_MID
start with 1
increment by 1
minvalue 1
nomaxvalue
nocache
插入并获取刚插入的序列函数如下:
create or replace function message_fun
(m in message_package.message_record
)
return number
as
num varchar2(10);
begin
num := 'MSG'||SEQ_MID.NEXTVAL;
insert into message
values
(num ,m.userid,m.ustateid,m.mtype,m.stime,m.etime,m.specification,
m.linkman,m.phone,m.photo,m.video,m.music,m.qq,m.msn);
return num;
end;
报错:在此上下文种不允许表,视图或序列引用“SEQ_MID.NEXTVAL”;
个人分析了一下,不知为什么这个SEQ_MID.NEXTVAL只能出现在insert语句中,求解!

你可以先申明一个变量然后将序列值插入到变量当中就可以了 例如
declare p_seq number;
begin
select SEQ_MID.NEXTVAL into p_seq from dual;
dbms_output.put_line( 'MSG'||p_seq);
end;
/
参考技术A 你的num不是number类型,因为在方法体里面你连接了varchar 'MSG' 参考技术B 您可以在下列情况使用NEXTVAL 和 CURRVAL:
SELECT语句的SELECT列表中,但不包括子查询中的SELECT语句
INSERT 语句中的子查询SELECT列表中
INSERT 语句的VALUES子句中
UPDATE语句的SET子句中

下列情况不能使用 NEXTVAL 和 CURRVAL:
在视图的SELECT列表中
包含DISTINCT关键字的 SELECT语句中
含有 GROUP BY, HAVING, ORDER BY子句的SELECT语句中
SELECT, DELETE, UPDATE 语句的子查询中
含有 DEFAULT表达式的 CREATE TABLE、 ALTER TABLE 语句中

如果我从一个应用程序的 Oracle 序列中获取 currval 而另一个应用程序同时插入会发生啥?

【中文标题】如果我从一个应用程序的 Oracle 序列中获取 currval 而另一个应用程序同时插入会发生啥?【英文标题】:What happens if I get currval from a sequence in Oracle from one application while another application is inserting at the same time?如果我从一个应用程序的 Oracle 序列中获取 currval 而另一个应用程序同时插入会发生什么? 【发布时间】:2016-03-21 21:05:16 【问题描述】:

假设我有一个正在插入表格的应用程序 (App1),我想从序列中获取 currval

-和-

同时,另一个应用程序 (App2) 从 App1 插入到我当前正在使用的同一个表中。我的currval线程安全吗?我会在 App1 中获得插入的 currval,还是可能会给我从 App2 中插入的 currval?

【问题讨论】:

【参考方案1】:

currval 被定义为返回提供给会话的序列的最后一个值。每个会话都会有一个不同的currval。获取序列的nextval 的不同会话对会话的currval 没有影响。同样的道理,你的会话的currval 并没有告诉你如果不同的会话请求nextval 会得到什么。

【讨论】:

是否有一些文档说明了这一点,或者您只是从经验中知道这一点? @BrianTHannan - 你可以从这里开始docs.oracle.com/cd/B19306_01/server.102/b14200/… currval 只有在当前会话中调用了nextval 后才对会话有效,并且序列被多个会话访问没有锁定的并发意味着其余的行为。

以上是关于oracle 如何获取刚插入的序列的主要内容,如果未能解决你的问题,请参考以下文章

当向Oracle数据库中插入数据时,如何获取行ID

获取从 C# (oracle) 调用的插入语句使用的序列号

MyBatis中如何获取刚插入数据的 id

如何获取新插入Oracle数据库Sequence值的5种方法

如何从 Oracle 中的 JDBC 批量插入中获取生成的密钥?

如果我从一个应用程序的 Oracle 序列中获取 currval 而另一个应用程序同时插入会发生啥?