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数据库Sequence值的5种方法