2016-04-14 20 views
0

私はmysqlを研究して以来、oracleのsql開発者にとって非常に新しいです。私はこのウェブサイトで私の質問に対する答えを探しましたが、提供された解決策は本当に理解できません。oracle 10gデータベースに挿入する方法とストアドプロシージャを使用して生成されたIDを返す

私が欲しいのは、javaからデータベースにオブジェクトを挿入した後に生成されたIDを返すことです。 mybatisとoracleの10gデータベースを使用しています。私はすでにテーブルとその列を作成しました。

ここマッパー

<insert id="addUser" parameterType="User" statementType="CALLABLE"> { CALL addUserSP( #{user.surname, javaType=String, jdbcType=VARCHAR, mode=IN}, #{user.firstName, javaType=String, jdbcType=VARCHAR, mode=IN}, #{userId, javaType=Integer, jdbcType=NUMBER, mode=OUT} )} </insert>

ための私のコードは(と私はすでに「CREATEUSER」という名前のパッケージを作成しました)ここに私のストアドプロシージャだのです

PROCEDURE ADDUSERSP 
(surname IN VARCHAR2, 
    firstName IN VARCHAR2, 
    userId OUT NUMBER 
) AS 

BEGIN 

INSERT INTO users("surname", "first_name") 
VALUES (surname, firstName); 
RETURNING user_id INTO userId; 

END ADDUSERSP; 

私がした内容によると、ここには、テーブルに新しいデータを追加するたびにuser_idを自動的にインクリメントするトリガー(?)とシーケンス(?)を作成する必要があるようです。しかし、私はそれをどうやって行うのか分かりません。

ここに私の質問があります: 私のストアドプロシージャは正しいですか?コードは不完全ですか?つまり、私はマッパーのパッケージを宣言していないし、それが必要であることを見たことがある(?)、これはこのようなものだ{ CALL [CreateUser].[addUserSP](blah blah...。シーケンスとトリガーを書き込むか、主キーuser_idを自動インクリメントする簡単な方法がありますか?また、構文をチェックしてください。構文には多くの問題があります。

ありがとうございました!

答えて

1

OracleでMySQL AUTO_INCREMENTをエミュレートするには、(見つかった)そのパターンはSEQUENCEオブジェクトとBEFORE INSERTトリガーを使用します。デモンストレーションとして

、シーケンス・オブジェクトに対してこのような何か:BEFORE INSERTトリガーの

CREATE SEQUENCE myseq START WITH 1 INCREMENT BY 1 ; 

そして、このような何か:限りの手順として

CREATE TRIGGER users_bi 
BEFORE INSERT ON users 
FOR EACH ROW 
BEGIN 
    IF :NEW.id IS NULL THEN 
     SELECT myseq.NEXTVAL INTO :NEW.id FROM DUAL; 
    END IF; 
END 

、私はSQL INSERT文をラップする余分なPL/SQLブロックの大ファンではありません。

戻ってくる前にセミコロンを追加したようです。その句はINSERT文の一部であり、別個の文ではありません。

PL/SQLブロック内のSQL文は、列とPL/SQL変数の両方を参照できます。変数が列と同じ名前を持つ場合、期待していない動作に遭遇する可能性があります。

通常、PL/SQLの作成者は、名前の競合の可能性を低減する変数の命名規則を使用します。 v_surnameなどの名前の変数が頻繁に表示されます。 (個人的には少し違う表記ですが、変数の名前は列の参照ではなく変数名のように見えますが、変数に使用するパターンの列には名前を付けません)。

二重引用符識別子は受け入れ可能ですが、これにより識別子は大文字と小文字を区別します。識別子が二重引用符で囲まれていない場合、Oracleは大文字であるかのように扱います。テーブルが小文字の列名で定義されていることを確認してください。

+0

が記載されています。そんなにスペンサーにありがとう!私はあなたが言ったことをやろうとします – chiliflavor

+0

私はあなたが手続きと同じスクリプトで提供したコードを書くべきですか?シーケンスやトリガーのフォルダ内にありますか?申し訳ありませんが、私はこれらのものに本当に精通していません! :( – chiliflavor

+0

SEQUENCEとTRIGGERは別々のデータベースオブジェクトです。その特定のトリガーは "users"テーブルに関連付けられています。 "フォルダ"を保持する必要があります。これらのオブジェクトがデータベースに作成されると、クライアントのブラウザはどこにでも表示されます。.sqlファイルに関しては、TRIGGERはテーブルに関連付けられているので、テーブルと同じスクリプトでもテーブル定義の近くに置いておきます。各テーブルに別々のSEQUENCEオブジェクトを使用すると、そのSEQUENCEの.sqlをテーブルとトリガの定義に近づけることができます。 – spencer7593

関連する問題