我在这里的第一篇帖子对我很轻松:)。
所以我使用以下代码创建了一个数据库表。(我正在使用Oracle 10g和Oracle JDBC。我有这个servlet代码与我制作的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)
);
现在我的servlet代码是这样的:
// 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();
我喜欢做的是在GM_Recipes表中插入一行,但是自动生成recipe_ID。(因为通过HTML表单我不会因为显而易见的原因而要求某人输入食谱ID)
我的代码的后半部分依赖于recipe_ID来创建将要创建的新配方。
我尝试了一些我从谷歌发现的生成密钥代码,但是我已经使用了几个小时,并且很好奇是否有人可以分享一些有意义的见解:)谢谢
答案 0 :(得分: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。如果您已在该表上有记录,请注意合适的序列起始值。
答案 1 :(得分:0)
10g& 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 :(得分:0)
感谢大家的帮助!
我执行了非正统的方法,得到了我想要的工作。
stmt22 = con.createStatement();
ResultSet ChoMax = stmt22.executeQuery("");
ChoMax.next();
int increm = ((Number) ChoMax.getObject(1)).intValue();
if(increm != 0){increm++;}
然后使用increm变量插回到我的preparedStatement代码