2016-04-06 19 views
1

私の最初の投稿はここにあるので、簡単に私に行く:)だから私は、次のコードを使用して、データベーステーブルを作成しプリペアドステートメントから自動生成された主キーID

。(イムOracle 10gおよびOracleのJDBCを使用した。イムは、このサーブレットのコードを持つが、私が作った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を持って自動生成される(私は明白なのためにレシピIDを入力するために誰かを要求しませんHTMLフォーム経由したようです。理由)

私のコードの後半部分は、作成される新しいレシピのrecipe_IDに依存しています。

アイブ氏は、私がグーグルから見つかりましたが、私は数時間のためにそれをされていると誰もが& 11グラムの自動インクリメント列を10gのおかげ

+0

に挿入するincrem変数を使用しました)だから、現時点では、私はGM_Recipesテーブルに3つの「テスト」レシピを持っています。テーブルに新しいレシピを挿入すると、recipe_ID4が生成されます(新しいレシピがテーブルに追加されるたびに増分されます)。 – ForgottenGhost

答えて

0

:)いくつかの意味のある洞察を共有することができれば興味があったてきたいくつかの生成のキーコードを試してみました利用できません。名前付きのシーケンス、トリガーを作成し、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; 

これは明らかにSQL * PlusまたはTOADで直接実行されるPL/SQLです。

2

あなたはその後、IDを生成するためにそれを使用し、(のはYOUR_SEQUENCEそれを呼びましょう)系列DB側を作成する必要があります。

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++;} 

は、その後、私は私が/はすでにこのコードのいずれかの前に、テーブルにいくつかのデータを挿入ハードコーディングすることを言及する必要があります。(私はSQLコードを書いていたときに戻って私のPreparedStatementコード

関連する問題