Как выбрать идентификаторы последовательности Oracle с упреждением в распределенной среде

Ну, есть много обучающих программ для баз данных онлайн для java (то, что вы ищете, называется JDBC). Но если вы используете простые сервлеты, у вас будет класс, который расширяет HttpServlet, и внутри него вы будете иметь два метода, которые выглядят как

public void doPost(HttpServletRequest req, HttpServletResponse resp){

}

и

public void doGet(HttpServletRequest req, HttpServletResponse resp){

}

Один из них вызывается для обработки операций GET, а другой используется для обработки операций POST. Затем вы будете использовать объект HttpServletRequest, чтобы получить параметры, которые были переданы как часть формы следующим образом:

String name = req.getParameter("name");

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

6
задан Zizzencs 4 September 2008 в 14:31
поделиться

4 ответа

Почему не только имеют последовательность как инкремент 100 все время? каждый "nextval" дает Вам 100 порядковых номеров для работы с

SQL> create sequence so_test start with 100 increment by 100 nocache;

Sequence created.

SQL> select so_test.nextval - 99 as first_seq, so_test.currval as last_seq from dual;

 FIRST_SEQ   LAST_SEQ
---------- ----------
         1        100

SQL> /

 FIRST_SEQ   LAST_SEQ
---------- ----------
       101        200

SQL> /

 FIRST_SEQ   LAST_SEQ
---------- ----------
       201        300

SQL> 

Примечание по Вашему примеру.. Не упустите DDL.. Это произведет неявную фиксацию

Пример фиксации производится DDL

SQL> select * from xx;

no rows selected

SQL> insert into xx values ('x');

1 row created.

SQL> alter sequence so_test increment by 100;

Sequence altered.

SQL> rollback;

Rollback complete.

SQL> select * from xx;

Y
-----
x

SQL> 
11
ответ дан 8 December 2019 в 14:49
поделиться

Почему необходимо выбрать идентификаторы последовательности во-первых? В большинстве случаев Вы вставили бы в таблицу и возвратили бы идентификатор.

insert into t (my_pk, my_data) values (mysequence.nextval, :the_data)
returning my_pk into :the_pk;

Это кажется, что Вы пытаетесь предварительно оптимизировать обработку.

Если ДЕЙСТВИТЕЛЬНО необходимо выбрать идентификаторы с упреждением, затем просто называют последовательность 100 раз. Весь смысл последовательности - то, что она справляется с нумерацией. Вы, как предполагается, не предполагаете, что можно получить 100 последовательных чисел.

3
ответ дан 8 December 2019 в 14:49
поделиться

У Matthew есть корректный подход здесь. По-моему, для приложения очень необычно сбросить текущее значение последовательности после каждого использования. Намного более стандартный для установки инкрементного размера на то, в чем Вы нуждаетесь заранее.

Кроме того, этот путь намного более производителен. Выбор nextval от последовательности является высоко оптимизированной операцией в Oracle, тогда как выполнение ddl для изменения последовательности является намного более дорогим.

Я предполагаю, что это действительно не отвечает на последнюю точку в Вашем отредактированном вопросе...

1
ответ дан 8 December 2019 в 14:49
поделиться

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

Я не могу действительно думать ни о каком случае, где я должен был сделать такого рода вещь, но вероятно самый легкий путь состоит в том, чтобы только сохранить "текущее" число где-нибудь и обновить его, поскольку Вам нужно оно.

Что-то вроде этого.

drop table t_so_test;

create table t_so_test (curr_num number(10));

insert into t_so_test values (1);
create or replace procedure p_get_next_seq (inc IN NUMBER, v_next_seq OUT NUMBER) As
BEGIN
  update t_so_test set curr_num = curr_num + inc RETURNING curr_num into v_next_seq;
END;
/


SQL> var p number;
SQL> execute p_get_next_seq(100,:p);

PL/SQL procedure successfully completed.

SQL> print p;

         P
----------
       101

SQL> execute p_get_next_seq(10,:p);     

PL/SQL procedure successfully completed.

SQL> print p;

         P
----------
       111

SQL> execute p_get_next_seq(1000,:p);

PL/SQL procedure successfully completed.

SQL> print p;

         P
----------
      1111

SQL> 
1
ответ дан 8 December 2019 в 14:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: