尝试使用SQL函数从dept表中获取下一个部门编号

时间:2016-05-29 00:01:45

标签: sql oracle

让我们假设我们有一个部门表,其DEPTNO值为(10,20,30,40 ......等) 如何创建获取下一个部门编号的功能? 我正在研究它,我想如果我不对,该功能应该包含序列,仍然不确定,需要你的帮助人。

解决这个问题将让我了解这些函数是如何工作的,如果可以解释代码是如何的,那么非常感谢你。

1 个答案:

答案 0 :(得分:2)

要获得表格中的数字并不容易。您可以选择最大值并添加10.但是如果使用数据库的两个人想要同时插入新部门会怎么样?它们都获得相同的最大数量,比如20,加10,并尝试插入相同的ID 30。

Oracle有序列。当两个人绘制下一个序列号时,必须等待另一个序列号,因此一个得到下一个数字30,另一个得到下面的数字,即40.但是当一个人通过回滚解除他们的插入时,那么ID不在表。例如,您可以获得记录10,20,40。

我认为也可以锁定整个表,然后选择最大值,插入该值+ 10并提交并释放表。

大多数人只是使用序列。而且他们不关心差距。只要它们是独一无二的,它们甚至不关心数字的外观。他们将它们用于技术ID,只存在能够关联表的技术ID;他们没有任何意义。另一方面,部门编号是业务属性。这不是数据库找到一个价值,而是一些人("嘿伙计们,我们建立了第二个购买部门,称之为B2")。因此,案例并不现实。无论如何:

以下是您可以创建的序列:

create sequence seq start with 10 increment by 10;

以下是如何使用它:

insert into dept (deptno, name) values (seq.nextval, 'Buying 2');

您还可以在插入时触发获取该序列值,或者从Oracle 12c开始使用它作为deptno的默认值。

这是一个选择max deptno并返回此加10的函数:

create or replace function next_deptno return integer
as
  v_max_deptno integer;
begin
  select coalesce(max(deptno), 10)
  into v_max_deptno
  from dept;

  return v_max_deptno + 10;
end next_deptno;