Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Как вставить толпу записей, используя при этом sequence?  [new]
SeqLover
Guest
Доброе утро.
У меня есть некий запрос, для упрощения:
select a, b from t_old
И его результат я вставляю в другую таблицу.
select into t_new select a, b from t_old

Проблема такая, что в этой новой табличке есть ещё поле, которое является PK, и значения в которое заносятся из sequnce. А использование sequence возможно только (как я понял) в случае insert values, ибо попытка выполнить
select into t_new select seq.nextval, a, b from t_old

приводит к ошибке ORA-02287.

Структуру таблицы я менять не могу, триггер делать - тоже не могу.
Пока вижу вариант курсора, но он мне естественно не нравится.
Какие ещё варианты существуют?
18 авг 06, 11:20    [3021611]     Ответить | Цитировать Сообщить модератору
 Re: Как вставить толпу записей, используя при этом sequence?  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 63986
Блог
SeqLover
У меня есть некий запрос, для упрощения:

Есть подозрение, что упростили Вы зря.

SeqLover
А использование sequence возможно только (как я понял) в случае insert values, ибо попытка выполнить
select into t_new select seq.nextval, a, b from t_old

приводит к ошибке ORA-02287.

Зря поняли.

SQL> create table t100 (i integer, j integer);

Table created

SQL> create sequence t100_seq;

Sequence created

SQL> insert into t100 select t100_seq.nextval, t100_seq.currval from dual connect by level <= 10;

10 rows inserted

SQL> select * from t100;

                                      I                                       J
--------------------------------------- ---------------------------------------
                                      1                                       1
                                      2                                       2
                                      3                                       3
                                      4                                       4
                                      5                                       5
                                      6                                       6
                                      7                                       7
                                      8                                       8
                                      9                                       9
                                     10                                      10

10 rows selected

SeqLover
Какие ещё варианты существуют?

Написать запрос так, чтобы в нем допускался сиквенс. Например, выкинуть distinct.
18 авг 06, 11:25    [3021664]     Ответить | Цитировать Сообщить модератору
 Re: Как вставить толпу записей, используя при этом sequence?  [new]
SeqLover
Guest
Вот этот запрос в оригинале
insert into RLE_PURCH_BLNKT_CNTRCT (BLNKT_CNTRCT_ID, UPDATE_COUNT, LAST_CHANGE_USER_ID, LAST_CHANGE_DATETIME, STATUS, SUPP_CODE, ITEM_CODE, LOOKUP, S_HEAD, DESCR, QTY, PRICE, CNTRCT_NUM, RECON_PRICE, UNIT_OF_PURCH_ULAB, CURR_CODE, START_DATETIME, END_DATETIME) 
select SSQ_RLE_PURCH_BLNKT_CNTRCT.NEXTVAL, 0, 'RB2', SYSDATE, 0, c.SUPP_CODE, i.ITEM_CODE, c.LOOKUP, 'PC#'||lpad(to_char( i.contract_id), 6, '0')||'#'||lpad(to_char(rownum), 3, '0'), c.DESCR, i.QTY, i.PRICE, c.CONTRACT_CODE, 0, i.UOM, c.CURR_CODE, c.START_DATE, c.END_DATE from RLE_RBC_CONTRACT_ITEM i INNER JOIN RLE_RBC_CONTRACT C ON C.CONTRACT_ID = I.CONTRACT_ID where i.CONTRACT_ID = 1 order by i.ITEM_CODE
18 авг 06, 11:27    [3021689]     Ответить | Цитировать Сообщить модератору
 Re: Как вставить толпу записей, используя при этом sequence?  [new]
SeqLover
Guest
Сорри, отформатировал немного. Дистинктов нету.

insert into RLE_PURCH_BLNKT_CNTRCT (BLNKT_CNTRCT_ID, UPDATE_COUNT, LAST_CHANGE_USER_ID, LAST_CHANGE_DATETIME, STATUS, SUPP_CODE, ITEM_CODE, LOOKUP, S_HEAD, DESCR, QTY, PRICE, CNTRCT_NUM, RECON_PRICE, UNIT_OF_PURCH_ULAB, CURR_CODE, START_DATETIME, END_DATETIME) 
select SSQ_RLE_PURCH_BLNKT_CNTRCT.NEXTVAL, 
0, 'RB2', SYSDATE, 0, c.SUPP_CODE, i.ITEM_CODE, c.LOOKUP, 'PC#'||lpad(to_char( i.contract_id), 6, '0')||'#'||lpad(to_char(rownum), 3, '0'), c.DESCR, i.QTY, i.PRICE, c.CONTRACT_CODE, 0, i.UOM, c.CURR_CODE, c.START_DATE, c.END_DATE 
from RLE_RBC_CONTRACT_ITEM i 
INNER JOIN RLE_RBC_CONTRACT C ON C.CONTRACT_ID = I.CONTRACT_ID 
where i.CONTRACT_ID = 1 order by i.ITEM_CODE
18 авг 06, 11:31    [3021739]     Ответить | Цитировать Сообщить модератору
 Re: Как вставить толпу записей, используя при этом sequence?  [new]
Ilya1st
Member

Откуда: из не москвы
Сообщений: 269
написать селект из селекта в котором в свою очередь уже дистинкт - никто не запретит.
18 авг 06, 11:33    [3021754]     Ответить | Цитировать Сообщить модератору
 Re: Как вставить толпу записей, используя при этом sequence?  [new]
SeqLover
Guest
Сорри, я понял - order by тут лишний!
Спасибо!
18 авг 06, 11:34    [3021759]     Ответить | Цитировать Сообщить модератору
 Re: Как вставить толпу записей, используя при этом sequence?  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 63986
Блог
На глаз не вижу в этом запросе ничего неправильного, исключая вряд ли задуманное Вами поведение rownum в связке с order by.

Выполняется ли этот запрос в PL/SQL или вызываете его напрямую? Если первое, выполняется ли он напрямую?
18 авг 06, 11:35    [3021772]     Ответить | Цитировать Сообщить модератору
 Re: Как вставить толпу записей, используя при этом sequence?  [new]
waspwort
Member

Откуда: Тамбов-сити
Сообщений: 325
SeqLover
Вот этот запрос в оригинале
...


Нельзя Nextval и Order By

http://download-uk.oracle.com/docs/cd/B19306_01/server.102/b14231/views.htm#sthref3105
18 авг 06, 11:36    [3021781]     Ответить | Цитировать Сообщить модератору
 Re: Как вставить толпу записей, используя при этом sequence?  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 63986
Блог
SeqLover
Сорри, я понял - order by тут лишний!

Забавно. Не знал о таком ограничении.
18 авг 06, 11:37    [3021788]     Ответить | Цитировать Сообщить модератору
 Re: Как вставить толпу записей, используя при этом sequence?  [new]
SeqLover
Guest
Ну, понятно, что я это ограничение обошёл, используя подзапрос, но всё равно спасибо.
И с rownum указали на ошибку, точнее неточность. Щас исправлю. Спасибо
18 авг 06, 11:40    [3021828]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить