Показаны сообщения с ярлыком генераторы. Показать все сообщения
Показаны сообщения с ярлыком генераторы. Показать все сообщения

четверг, 7 февраля 2013 г.

INSERT ... SELECT ... [sequence] ... GROUP BY

Встретился с такой задачей:
нужно в Таблицу_1 вставить сгруппированные значения из Таблицы_2 и одновременно присвоить каждой новой записи в Таблице_1 порядковый номер (sequence)

Пример:
insert into UserOrg(id,access_mode,org_id,sysuser_id)
select
userorg_seq.nextval,
min(rorg.access_mode),
rorg.org_id
from [бла-бла-бла]
group by
rorg.org_id

Этот запрос завершается с ошибкой:
ORA-02287: порядковый номер здесь недопустим
02287. 00000 - "sequence number not allowed here"
*Cause: The specified sequence number (CURRVAL or NEXTVAL) is inappropriate
here in the statement.
*Action: Remove the sequence number.

Нашел решение здесь: нужно вынести порядковый номер (sequence) за скобки, включив остальную часть запроса SELECT (которую необходимо сгруппировать) в отдельный подзапрос с поименованными полями:

insert into userorg(id,access_mode,org_id,sysuser_id,version)
select userorg_seq, daAccessMode, daOrgId ... from (
select
min(rorg.access_mode) as daAccessMode,
rorg.org_id as daOrgId,
...
from [бла-бла-бла]
group by rorg.org_id, vur.sysuser_id);

Подглядел здесь: http://stackoverflow.com/questions/7125936/oracle-sql-use-sequence-in-insert-with-select-statement

P.S. оформить запись перед закрытием

четверг, 12 января 2012 г.

Генераторы в SQL-скриптах (АЦК)

Вместо устаревшей конструкции генерации ID
(для Firebird)
gen_id(kdf_lines_seq,1)+(select site_id*1000000000 from systemsite where sitetype=0)
(для Oracle)
http://beepings.blogspot.com/2011/10/oracle.html
лучше использовать
GenNext(kdf_lines_seq)+GetSiteOffset
Она подходит, для обеих СУБД.

понедельник, 17 октября 2011 г.

Архив