下面是我的表格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,那么我可以使用MERGE
sql命令,但该数据库不支持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();
我得到例外?这是执行它的正确方法吗?
答案 0 :(得分:1)
嗯,我认为你必须以传统的方式做到这一点。
如果行不存在 插入 其他 更新
答案 1 :(得分:1)
我同意@tabish在这里。你必须以传统方式去做。 您建议我认为您造成更多伤害的方式 - 您对源表中的每一行(到目标表或ERR表)执行插入,然后执行其他更新。 在最坏的情况下,当你必须更新所有行时,你将执行两倍的dml操作。 这在我的书中不是一个好主意。 祝你好运。
答案 2 :(得分: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异常here和here的更多信息。
另一种选择是在检查计数后插入或更新数据。
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;