首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >oracle应用程序中plsql代码中的序列生成器

oracle应用程序中plsql代码中的序列生成器
EN

Stack Overflow用户
提问于 2018-05-29 11:32:01
回答 3查看 139关注 0票数 3

我有一张样本表如下所示

代码语言:javascript
复制
PO_HEADER ||    ITEM   || LINE_NUM

   1              X 
   1              Y 
   1              Z 
   1              A 
   1              B 

我想更新line_num列中的序列号,比如1.5。,当我输入另一行时,应该像line_number列中的6一样自动生成下一个序列号。

我想编写代码来更新line_num中的序列号&还想捕获下一个序列号。所以当我输入新行时,我应该得到下一个序列号。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-05-29 15:18:20

演示:http://sqlfiddle.com/#!4/4d6ff/1

代码语言:javascript
复制
CREATE TABLE Table1
    ("PO_HEADER" int, "ITEM" varchar2(1), "LINE_NUM" int)
;

INSERT ALL 
    INTO Table1 ("PO_HEADER", "ITEM", "LINE_NUM")
         VALUES (1, 'X', NULL)
    INTO Table1 ("PO_HEADER", "ITEM", "LINE_NUM")
         VALUES (1, 'Y', NULL)
    INTO Table1 ("PO_HEADER", "ITEM", "LINE_NUM")
         VALUES (1, 'Z', NULL)
    INTO Table1 ("PO_HEADER", "ITEM", "LINE_NUM")
         VALUES (1, 'A', NULL)
    INTO Table1 ("PO_HEADER", "ITEM", "LINE_NUM")
         VALUES (1, 'B', NULL)
SELECT * FROM dual
;

create sequence alamakota;

现在:

代码语言:javascript
复制
update table1 set LINE_NUM = alamakota.nextval;

select * from table1;

| PO_HEADER | ITEM | LINE_NUM |
|-----------|------|----------|
|         1 |    X |        1 |
|         1 |    Y |        2 |
|         1 |    Z |        3 |
|         1 |    A |        4 |
|         1 |    B |        5 |
票数 0
EN

Stack Overflow用户

发布于 2018-05-29 15:18:44

人们通常使用一个序列(Oracle对象),它提供了唯一性,但(通常来说)并不是无懈可击的。Sequence易于实现;您可以在insert期间调用它,或者创建一个数据库触发器,将列值设置为下一个序列号。

如果坚持使用"MAX + 1“选项,请注意,它在多用户环境中即将失败--两个或多个用户获取相同的最大值,这取决于COMMIT矩和列唯一性(主/唯一键、唯一索引),第一个选项将成功,其他每个用户的插入都将失败。

还有一个变通方法--附加的表,其序列号是通过一个自治事务函数来维护的。

如果您在12c,请使用identity列。否则,我会建议一个序列。

票数 0
EN

Stack Overflow用户

发布于 2018-05-29 15:44:16

我不会用序列来做这个。

如果有一个父表(其中PO_HEADER是外键),则获取父行上的锁。然后,将SELECT MAX(line_num)+1...用于该PO并使用它。在将插入提交到TABLE1之前,不要释放父表上的锁。

如果没有父表,则可以使用DBMS_LOCK完成相同的任务。(分配代表PO的用户锁并锁定它以代替父表)。

因为您的应用程序设计得很好,而且所有的TABLE1插入都是通过这段代码进行的,所以您知道它会工作的。父表上的锁确保两个会话不会获得相同的下一个行号,因为锁强制它们一个接一个地执行操作。

如果您的应用程序设计得不太好,这将无助于您。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50583318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档