2016-04-06 3 views
1

Мое первое сообщение здесь так легко на меня :).Идентификатор сгенерированного автогенератора из подготовленного заявления

Так что я создал таблицу базы данных, используя следующий код. (Im использованием Oracle 10g и Oracle JDBC. Im имея этот сервлет код общаться с HTML-формы я сделал.)

CREATE TABLE GM_Recipes 
(
    recipe_ID NUMBER(4) PRIMARY KEY, 
    rec_name VARCHAR2(50), 
    recipe_cat VARCHAR2(50), 
    rec_desc VARCHAR2(1000), 
    author VARCHAR2(50) 
); 

Теперь мой сервлет код как таковой:

// Fill Recipes table 
     PreparedStatement pstmt = con.prepareStatement("INSERT INTO GM_Recipes(rec_name,recipe_cat,rec_desc,author) VALUES (?,?,?,?)"); 
     pstmt.clearParameters(); 

     String opt1 = req.getParameter("RecName"); //parameters from HTML form 
     String opt2 = req.getParameter("choice"); //parameters from HTML form 
     String opt3 = req.getParameter("CookDesc"); //parameters from HTML form 
     String opt4 = req.getParameter("author"); //parameters from HTML form 

     pstmt.setString(1,opt1); 
     pstmt.setString(2,opt2); 
     pstmt.setString(3,opt3); 
     pstmt.setString(4,opt4); 

     ResultSet rs = pstmt.executeQuery(); 

Что Id хотел сделать, это вставить строку в таблицу GM_Recipes, но имеют recipe_ID быть сгенерированы автоматически (как через HTML-форму, я не буду просить кого-то, чтобы ввести рецепт ID для очевидны. причины)

Более поздние части моего кода зависят от recipe_ID для новых рецептов, которые будут созданы.

Ive пытался некоторые генерировать ключи код, который я нашел в гугле, но я был в нем в течение нескольких часов, и было интересно, если кто-то может поделиться содержательную понимание :) Спасибо

+0

Я должен упомянуть, что я жёстко~d/вставить некоторые данные в таблицу уже до какого-либо из этого кода. (Когда я писал код SQL) Итак, на данный момент у меня есть 3 «тестовые» рецепты в таблице GM_Recipes. SO, если я вставляю новый рецепт в таблицу, я бы хотел, чтобы recipe_ID из 4 был сгенерирован и т. Д. (С каждым новым рецептом, добавленным в таблицу). – ForgottenGhost

ответ

0

в 10г & 11g автоматического приращения столбцов не доступны. Вы должны создать именованную последовательность, триггер и использовать выражение nextval, чтобы засеять первичный ключ.

--create sequence seq_gm_recipes; 
--this would work, if your table doesn't have records yet 
--otherwise use the below 
declare i_start int; 
begin 
    select max(recipe_id)+1 into i_start from GM_Recipes; 
    execute immediate 'create sequence seq_gm_recipes start with ' || i_start; 
end; 

CREATE OR REPLACE TRIGGER trg_GM_Recipes 
BEFORE INSERT ON GM_Recipes 
REFERENCING NEW AS New OLD AS Old 
FOR EACH ROW 
DECLARE 
    l_Var NUMBER; 
BEGIN 
    SELECT seq_gm_recipes.NEXTVAL INTO l_Var FROM dual; 
    :NEW.recipe_id := l_Var; 
END; 

Это PL/SQL, очевидно, должно выполняться непосредственно в sql * plus или TOAD.

2

Вы должны создать сторону последовательности дб (назовем его YOUR_SEQUENCE), а затем использовать его для создания ID:

PreparedStatement pstmt = con.prepareStatement("INSERT INTO GM_Recipes(recipe_id, rec_name,recipe_cat,rec_desc,author) VALUES (YOUR_SEQUENCE.nextval, ?,?,?,?)"; 

P.S. Если у вас уже есть записи в этой таблице, обратите внимание на подходящее начальное значение последовательности.

0

Спасибо за помощь!

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

stmt22 = con.createStatement();  
ResultSet ChoMax = stmt22.executeQuery(""); 
ChoMax.next(); 

int increm = ((Number) ChoMax.getObject(1)).intValue(); 
if(increm != 0){increm++;} 

Затем использовал переменный ИНКРЕМ.ДАТЧИК, чтобы вставить обратно в PreparedStatement код

Смежные вопросы