Хранимая процедура для возврата списка идентификаторов последовательности - PullRequest
2 голосов
/ 01 декабря 2010

Мне нужна небольшая хранимая процедура для выполнения следующей логики?

имя_процесса (seq_name IN varchar2 (50), block_count IN int, return_ids OUT)цикл от 1 до block_countreturn_ids: = выбрать 'seq_name' || .nextVal из двойного;конец циклаreturn return_ids

По сути, я хочу иметь хранимую процедуру, которая позволяет мне передавать имя последовательности, сколько идентификаторов мне нужно и возвращать мне сгенерированный список идентификаторов, которые я могу использовать в JAVA.Причина сделать это для меня - вернуть список идентификаторов, которые я могу использовать в JAVA, и никто другой не использует эти идентификаторы последовательности.Где они будут использоваться в некоторых других массовых вставках позже по линии.По сути, зарезервируйте блок идентификаторов последовательности.

Ответы [ 5 ]

3 голосов
/ 01 декабря 2010

Вот один из способов вернуть массив из процедуры PL / SQL.

Создайте тип коллекции чисел, инициализируйте его в своей процедуре и заполните его числами для возврата.Например:

create or replace type narray as table of number;

create or replace procedure get_seq_ids(seq_name in varchar2, 
    block_count in number, return_ids out narray)
as
begin
    return_ids := narray();
    return_ids.extend(block_count);
    for i in 1 .. block_count
    loop
        execute immediate 'select ' || seq_name || '.nextval from dual' 
            into return_ids(i);
    end loop;
end;
/
1 голос
/ 02 декабря 2010

Другим вариантом может быть использование предложения RETURNING для автоматического возврата значений последовательности после вставки.

1 голос
/ 01 декабря 2010

Я был бы обеспокоен логикой, которая требует, чтобы идентификаторы генерировались до того, как записи будут вставлены в базу данных.

В качестве альтернативы вы можете сначала рассмотреть возможность вставки строк, выбора идентификаторов из строк, а затемиспользуя оператор обновления для выполнения вашей массовой операции.Это, однако, все еще не так предпочтительно, поскольку код Java не зависит от идентификаторов до тех пор, пока фактическая информация не будет готова для вставки.

Вы можете перенести свою информацию в XML (или любой другой формат данных, который может понять ваша база данных).), а затем вызовите хранимую процедуру для выполнения массовых вставок.

0 голосов
/ 01 декабря 2010

Вот что я делаю для Java-приложения, которое я поддерживаю (которое также использует массовые вставки в глубоко иерархические таблицы)

PROCEDURE get_nextvals
( 
    p_values OUT SYS_REFCURSOR,
    p_count  IN  PLS_INTEGER
)
IS
    -- return the next p_count values from the PK sequence
BEGIN
    OPEN p_values FOR
        SELECT
            <schema>.<sequence>.nextval
        FROM
            dual
        CONNECT BY
            LEVEL <= p_count
    ;
END;

Проще было просто передать курсор в java, чем в приложении использовать тип таблицы, определенный в БД.

0 голосов
/ 01 декабря 2010

ИМХО, лучшее, что вы можете сделать, это просто сослаться на sequence_name.nextval прямо в вашем INSERT INTO, в предложении VALUES.

Вы сказали, что хотите, чтобы другие не использовали те же идентификаторы.Ссылка этот сайт :

Последовательность (или, в данном случае, Oracle) гарантирует, что ни один другой сеанс или другой вызов nextval в этом же сеансе не получит тот же номер из последовательности.

Итак, уникальность порядковых номеров гарантирована в Oracle.

...