oracle中序列的相关问题,insert ...... select 报错

oracle中序列的相关问题,insert......select报错我现在有一个需求需要用存储过程往一个表中插入数据,主键使用序列。插入数据的语句格式是insertin... oracle中序列的相关问题,insert ...... select 报错 我现在有一个需求需要用存储过程往一个表中插入数据,主键使用序列。插入数据的语句 格式是 insert into table1(id,zd1,zd2,zd3.....) select sequence_id.nextval, zd1,zd2,zd3...... from table2 这样执行会报错 此处不允许使用序号 如果 insert into table1(id,zd1,zd2,zd3.....) select (select nvl(max(id),0) from table1 ) +1 as id ,zd2,zd3...... from table2 执行完后插入id 列的值都是一样的。主键不唯一 。 insert into table1(id,zd1,zd2,zd3.....) select (select count(*) from table1 ) +1 as id ,zd2,zd3...... from table2 情况和上面一样 。现在想问一下,谁有没有更好的办法 除了使用游标一条一条的插入 。 展开
 我来答
zjy198518
2014-01-15 · TA获得超过867个赞
知道小有建树答主
回答量:777
采纳率:80%
帮助的人:569万
展开全部
语句语法应该没问题,我经常用这种方式插入,你在序列钱加入数据库OWNER名试试看,即
insert into table1(id,zd1,zd2,zd3.....) select 用户名.sequence_id.nextval, zd1,zd2,zd3...... from table2

不推荐用select nvl(max(id),0) from table1 ) +1,因为如果你中间有数据删除,ID就会重新排序,对历史数据,如果涉及到流程就会错乱了
追问
这个表如果要设置联合主键得设置96个, 为了避免麻烦 所以设置一个 ID形式上的主键,所以ID号是不重要的。 这个表只是存储中间计算结果 ,下次计算就会基本上清空整张表。
小狂中E
2014-01-15 · TA获得超过1418个赞
知道大有可为答主
回答量:1514
采纳率:66%
帮助的人:1030万
展开全部
我测试 insert into t1(id) select seq_id.nextval from t2, 这个正常呀,你是不是子查询用了group by或order by?
追问
子查询很复杂   使用了GROUP BY
追答
Restrictions on Sequence Values You cannot use CURRVAL and NEXTVAL in the
following constructs:
■ A subquery in a DELETE, SELECT, or UPDATE statement
■ A query of a view or of a materialized view
■ A SELECT statement with the DISTINCT operator
■ A SELECT statement with a GROUP BY clause or ORDER BY clause 
■ A SELECT statement that is combined with another SELECT statement with the
UNION, INTERSECT, or MINUS set operator
■ The WHERE clause of a SELECT statement
■ The DEFAULT value of a column in a CREATE TABLE or ALTER TABLE statement
■ The condition of a CHECK constrain

你可以再包一层,如:

insert into t2 select t1.f1,t1.f2,...,t1.fn, seq.nextval from (你的查询) t1

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
保寞不0X
2014-01-15
知道答主
回答量:16
采纳率:0%
帮助的人:4.9万
展开全部
后两个sql肯定是不行的,没有commit之前,table1的max(id)和数量count(*)不会变的。
第一个sql感觉没有问题,能把报错的具体信息贴出来吗,另外sequence_id应该在建立存储过程之前就建好没有问题吧。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
badkano
2014-01-15 · 知道合伙人体育行家
badkano
知道合伙人体育行家
采纳数:144776 获赞数:885371
团长

向TA提问 私信TA
展开全部
insert into table1 select sequence_id.nextval,t.zd1,t.zd2,t.zd3... from  (select zd1,zd2,zd3...from table2) t

这样呢?

更多追问追答
追问
问题出在我的子查询里使用了group by
追答
子x查询原本的语句发一下
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2014-01-15
展开全部
insert into table1(id,zd1,zd2,zd3.....) select (select count(*) from table1 ) +rownum as id ,zd2,zd3...... from table2
追问
插入数据的表会经常删除数据  这样做会导致 ID重复

(select nvl(max(id),0) from table1 ) + rownum 解决
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式