下面是我的桌子ID column is Primary Key。其他两列是字符串。
ID column is Primary Key
我正在使用一个名为的新数据库XpressMP。
XpressMP
Column Name ------- ID PrimaryKey SEARCHES String ACCOUNT String
我正在尝试实现UPSERT此处的功能-
UPSERT
If ID doesn't exists here then insert a new record. And ID exists then update the record.
我知道如果我正在使用Oracle,那么我可以使用MERGEsql命令,但是MERGE该数据库不支持sql命令,到目前为止,还没有其他命令。但是我相信我可以做同样的事情Stored Procedure。
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();
我有例外吗?这是执行它的正确方法吗?
您可以使用DUP_VAL_ON_INDEX异常来处理它。 您可以在您的过程中添加以下代码,该代码应符合您的要求。
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;