从准备好的语句

时间:2016-04-06 22:10:52

标签: java sql oracle jdbc

我在这里的第一篇帖子对我很轻松:)。

所以我使用以下代码创建了一个数据库表。(我正在使用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来创建将要创建的新配方。

我尝试了一些我从谷歌发现的生成密钥代码,但是我已经使用了几个小时,并且很好奇是否有人可以分享一些有意义的见解:)谢谢

3 个答案:

答案 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代码