2

以下は私のテーブルID column is Primary Keyです。他の 2 つの列は文字列です。

という名前の新しいデータベースを使用していXpressMPます。

Column Name                
-------
ID             PrimaryKey                 
SEARCHES       String
ACCOUNT        String

ここの機能を実現しようとしていますUPSERT-

If ID doesn't exists here then insert a new record.
And ID exists then update the record.

私がOracleで作業している場合、MERGEsqlコマンドを使用できますがMERGE、そのデータベースではサポートされておらず、現在のところ他のコマンドはありません。しかし、私は で同じことができると信じていStored Procedureます。

ストアドプロシージャで同じことを行うにはどうすればよいですか?ストアドプロシージャがそこで機能するため。

更新しました:-

public final static String INSERT = "BEGIN"
+" INSERT INTO TABLE (ID, SEARCHES, ACCOUNT) VALUES (?, ?, ?)"
+" EXCEPTION"
+" WHEN DUP_VAL_ON_INDEX THEN"
+" UPDATE TABLE"
+" SET SEARCHES = ?, ACCOUNT = ?"
+" WHERE ID = ?"
+" END";

上記のストアドプロシージャをこのように実行しようとするたびに

preparedStatement = dbConnection.prepareStatement(INSERT);

preparedStatement.setString(1, String.valueOf(userId));
preparedStatement.setString(2, Constants.getaAccount(userId));
preparedStatement.setString(3, Constants.getaAdvertising(userId));
preparedStatement.executeUpdate();

例外が発生しますか? これはそれを実行する正しい方法ですか?

4

3 に答える 3

1

ここで@tabishに同意します。従来の方法で行う必要があります。あなたが提案した方法は、あなたがより多くの害を引き起こしていると思います-ソーステーブルの各行に対して(ターゲットテーブルまたはERRテーブルのいずれかに)挿入を実行し、追加の更新を実行します。最悪の場合、すべての行を更新する必要がある場合、2 倍の dml 操作を実行することになります。 これは私の本では良い考えではありません。幸運を。

于 2013-02-09T22:32:14.950 に答える
1

そうですね、伝統的な方法でそれをしなければならないと思います。

行が存在しない場合 INSERT ELSE UPDATE

于 2013-02-09T05:14:07.380 に答える
0

DUP_VAL_ON_INDEX例外を使用して処理できます。
以下のコードを手順に追加すると、要件を満たすはずです。

CREATE OR REPLACE PROCEDURE TABLE_UPSERT (v_id IN NUMBER,
                                          v_searches IN VARCHAR2(20),
                                          v_account IN VARCHAR2(20)) AS
BEGIN
  INSERT INTO table (id, searches, account) VALUES (v_id, v_searches, v_account) ;
EXCEPTION
  WHEN DUP_VAL_ON_INDEX THEN
    UPDATE TABLE
    SET searches = v_searches, account = v_account
    WHERE id = v_id;
END;
/

DUP_VAL_ON_INDEX 例外の詳細については、こちらこちらをご覧ください。


別のオプションは、カウントを確認した後にデータを挿入または更新することです。

DECLARE
  l_count number;
BEGIN
  SELECT count(*) 
  INTO l_count
  FROM table 
  WHERE id = (value);

  IF l_count = 0 THEN
    INSERT into table VALUES ....;
  ELSE
    UPDATE table SET searches = .., account = ..;
  END IF;
END;
于 2013-02-09T05:25:31.697 に答える