как добавить уникальный порядковый номер вместе с данными другой таблицы

Я запускаю код PL/SQL на оракуле, который должен вставлять данные из таблицы «А» в таблицу «В» вместе с уникальной последовательностью, возвращаемой из функции. Мой sql-запрос выглядит так

SEQUENCE_COLUMN:=SEQ_COL_FUNC('WTPARTMASTER', 'ELEM10',SEQUENCE_COLUMN);
sequence_value:=seq_val_func('WTPARTMASTER', 'ELEM10',sequence_value);
dest_Columns:=dest_Columns || ',' || sequence_column;

QUERY_TEST :=  'insert into wbm.' || DESTINATION_TABLE || '(' || DEST_COLUMNS || ') select ' || SRC_COLUMNS || ', :value from ' || SOURCE_TABLE;

execute immediate query_test USING sequence_value;

Теперь проблема в том, что оператор select выводит все данные за один раз, и я получаю ту же последовательность №. в каждой строке вместо уникального порядкового номера.

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

Спасибо за вашу помощь.


person user3069865    schedule 24.12.2013    source источник
comment
Что делает seq_val_func — использует ли он реальную последовательность Oracle для генерации следующего значения? Можете ли вы вызвать функцию непосредственно из вставки, а не сохранять результат в переменной и передавать ее как привязку? Это может по-прежнему давать одно и то же значение для нескольких строк, если вы делаете insert ... select ..., но это зависит. Было бы лучше использовать последовательность непосредственно в операторе — может быть, ваша функция может вернуть имя последовательности, и вместо этого вы сделаете эту часть динамического оператора?   -  person Alex Poole    schedule 24.12.2013


Ответы (2)


Почему у вас есть seq_val_func()?

Просто используйте sequence_name.nextval и sequence_name.currval для доступа к значениям из последовательности. Похоже, вы пытаетесь динамически определить правильное имя_последовательности, а затем использовать его в части динамического SQL. Это нормально (мне кажется слишком сложным, но я не знаю ваших бизнес-требований), но вы должны напрямую ссылаться на nextval или currval в своем динамически сгенерированном операторе SQL.

person Mark J. Bobak    schedule 24.12.2013

Я думаю, что это, вероятно, то, что вы хотите:

SEQUENCE_COLUMN:=SEQ_COL_FUNC('WTPARTMASTER', 'ELEM10',SEQUENCE_COLUMN);
dest_Columns:=dest_Columns || ',' || sequence_column;

QUERY_TEST :=  'insert into wbm.' || DESTINATION_TABLE || '(' || DEST_COLUMNS || ') select ' || SRC_COLUMNS || ', seq_val_func('WTPARTMASTER', 'ELEM10',sequence_value) from ' || SOURCE_TABLE;

execute immediate query_test;

Это вызовет ваш seq_val_func для каждой вставленной записи.

person Todd Gibson    schedule 24.12.2013
comment
так не делается :( - person user3069865; 26.12.2013