2

下面是我的表,其中ID column is Primary Key. 其他两列是字符串。

我正在使用一个名为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

好吧,我认为您必须以传统方式进行操作。

如果行不存在插入其他更新

于 2013-02-09T05:14:07.380 回答
1

我在这里同意@tabish。你必须用传统的方式来做。您建议的方式我认为您会造成更大的伤害-您对源表中的每一行(到目标表或 ERR 表)执行插入,然后执行额外的更新。在最坏的情况下,当您必须更新所有行时,您将执行两倍的 dml 操作。 在我的书中,这不是一个好主意。祝你好运。

于 2013-02-09T22:32:14.950 回答
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 回答