2013-03-19 3 views
0

У меня есть таблица Лицо содержит поля personName, personId и без указания первичного я добавил некоторые значения в таблицу. Значения в таблице Person являютсяПоследовательность Oracle не генерирует

('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; 

Если я выполнить приведенный выше запрос, когда значения в таблице, то выполнить правильно, но когда у меня есть пустая таблица, означает, что в таблице нет записи, тогда указанный выше запрос не генерирует последовательность.

Я попробовал также заявление.

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, который обозначает число я даю недопустимый номер. Но я не знаю, где ошибка?
Любая помощь очень ценится.

ответ

1

Попробуйте

select nvl(max(rownum),0)+1 into id from Person; 

Когда таблица пуста макс (ROWNUM) вернет нуль и при добавлении null к значению всегда будет возвращать значение null, поэтому вам нужно преобразовать любые значения нуля в 0, чтобы 0 + 1 вернул 1, а не null

+0

я уже читал эту концепцию в моей школе день, но я действительно забыть о NVL. Спасибо, что напомнили. – MGPJ

+0

Можете ли вы рассказать мне, почему это утверждение If не работает – MGPJ

+0

@muniganesh, проверить обновленный ответ –

0

создать последовательность один раз, как этот

CREATE SEQUENCE person_seq 
START WITH  1000 
INCREMENT BY 1 
NOCACHE 
NOCYCLE; 

чем использование - «person_seq.nextval» для каждой вставки новой записи
например

вставки в лицо (имя, идентификатор) значений ('ABC', person_seq.nextval)

+0

Я согласен, это гораздо более надежным и эффективным, чем выбрать максимум из таблицы –

1

upd: только что заметил более важный недостаток, чем count/rownum.

id=null. Никогда не делайте этого, это не сработает.

Вы проверяете, является ли значение null таким образом: id is null.

NULLS

Использование count(*).

12:03:55 [email protected]> 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 [email protected]> 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 [email protected]> select object_name from user_objects where object_name = 'PERSONSEQ'; 

OBJECT_NAME 
--------------------------------------- 
PERSONSEQ 

Elapsed: 00:00:00.08 
12:06:16 [email protected]> truncate table person; 

Table truncated. 

Elapsed: 00:00:00.32 
12:06:27 [email protected]> drop sequence personseq; 

Sequence dropped. 

Elapsed: 00:00:00.20 
12:06:33 [email protected]> 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 [email protected]> select personseq.nextval from dual; 

    NEXTVAL 
---------- 
     1 

Elapsed: 00:00:00.04 
Смежные вопросы