让我们假设我们有一个部门表,其DEPTNO值为(10,20,30,40 ......等) 如何创建获取下一个部门编号的功能? 我正在研究它,我想如果我不对,该功能应该包含序列,仍然不确定,需要你的帮助人。
解决这个问题将让我了解这些函数是如何工作的,如果可以解释代码是如何的,那么非常感谢你。
答案 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;