Oracle序列未生成
我有一个表Person包含的字段是personName、personId,在没有指定主字段的情况下,我在表中添加了一些值。表Person中的值为Oracle序列未生成,oracle,oracle11g,Oracle,Oracle11g,我有一个表Person包含的字段是personName、personId,在没有指定主字段的情况下,我在表中添加了一些值。表Person中的值为 ('muni',1) ('Ganesh',1) 我需要将主键添加为personId,并将列修改为自动生成。因此,我尝试通过以下查询生成序列,以生成触发器 declare id number; begin select max(rownum)+1 into id from Person; execu
('muni',1)
('Ganesh',1)
我需要将主键添加为personId,并将列修改为自动生成。因此,我尝试通过以下查询生成序列,以生成触发器
declare
id number;
begin
select max(rownum)+1 into id from Person;
execute immediate 'create sequence personseq start with '||to_char(id);
end;
如果我在值位于表中时执行上述查询,那么它将正确执行,但是当我有一个空表,这意味着表中没有条目时,则上述查询不会生成序列
我也尝试了if语句
declare
id number;
begin
select max(rownum)+1 into id from Person;
if (id=null) then
execute immediate 'create sequence personseq start with '||to_char(1);
else
execute immediate 'create sequence personseq start with '||to_char(id);
end if;
end;
系统显示错误号为ORA01722
,表示我给出的号码无效。但我不知道哪里出错了?非常感谢您的帮助。像这样创建一个序列
CREATE SEQUENCE person_seq
START WITH 1000
INCREMENT BY 1
NOCACHE
NOCYCLE;
而不是在每次插入新记录时使用“person_seq.nextval”e、 g 在person(姓名、id)值中插入('abc',person_seq.nextval)试试这个
select nvl(max(rownum),0)+1 into id from Person;
当表为空时,max(rownum)将返回null,当您将null添加到值时,将始终返回null,因此您需要将任何null转换为0,以便0+1将返回1而不是null。upd:刚刚注意到比count/rownum更重要的缺陷
id=null
。千万不要那样做,这样不行
通过以下方式检查值是否为null:id为null
使用计数(*)
我在上学的时候已经读过这个概念,但我真的忘记了nvl。谢谢提醒。但是我比较了id为空,没有任何有效的numbers@muniganesh,正如现在提到的,您应该始终使用IS null检查null,null不等于null,null是未定义的东西,因此您无法对它们进行比较。@rs感谢您的澄清,这比从表中选择最大值更可靠、更高效
12:03:55 SYSTEM@saz-dev> create table person as
12:04:05 2 select 'muni' name, 1 attribute from dual union all
12:04:32 3 select 'ganesh' name, 1 attribute from dual;
Table created.
Elapsed: 00:00:00.07
12:04:47 SYSTEM@saz-dev> ed
Wrote file S:\tools\buffer.sql
1 declare
2 id number;
3 begin
4 select count(*)+1 into id from person;
5 execute immediate 'create sequence personseq start with '||to_char(id)||' increment by 1';
6* end;
12:05:52 7 /
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.06
12:05:53 SYSTEM@saz-dev> select object_name from user_objects where object_name = 'PERSONSEQ';
OBJECT_NAME
---------------------------------------
PERSONSEQ
Elapsed: 00:00:00.08
12:06:16 SYSTEM@saz-dev> truncate table person;
Table truncated.
Elapsed: 00:00:00.32
12:06:27 SYSTEM@saz-dev> drop sequence personseq;
Sequence dropped.
Elapsed: 00:00:00.20
12:06:33 SYSTEM@saz-dev> declare
12:06:38 2 id number;
12:06:38 3 begin
12:06:38 4 select count(*)+1 into id from person;
12:06:38 5 execute immediate 'create sequence personseq start with '||to_char(id)||' increment by 1';
12:06:38 6 end;
12:06:39 7 /
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.03
12:06:40 SYSTEM@saz-dev> select personseq.nextval from dual;
NEXTVAL
----------
1
Elapsed: 00:00:00.04