确保在PL / SQL中仅更新一行?

And*_*ers 1 sql oracle plsql sql-update

我UPDATE在Oracle 11g服务器上运行的语句很长:

UPDATE Table SET Column1 = 'One' WHERE Column2 = 'Example';
UPDATE Table SET Column1 = 'Two' WHERE Column2 = 'Something';
-- ...
Run Code Online (Sandbox Code Playgroud)

我想检查每个UPDATE行是否恰好影响了一行(不为零,不超过一行),如果它没有停止执行,则引发错误并回滚所有更新。

我希望这样的语法:

UPDATE Table SET Column1 = 'One' WHERE Column2 = 'Example';
ASSERT sql%rowcount = 1;
Run Code Online (Sandbox Code Playgroud)

那似乎不存在,所以也许我应该做这样的事情:

UPDATE Table SET Column1 = 'One' WHERE Column2 = 'Example';
IF sql%rowcount != 1 THEN
  -- Do something, but what?
END IF;
Run Code Online (Sandbox Code Playgroud)

但是,我不确定在IF语句中添加什么,或者这是否是一个好方法。那么,实现这一目标的最优雅的方法是什么?

MT0*_*MT0 5

UPDATE your_table SET Column = 'One' WHERE Key = 'Example';
IF SQL%ROWCOUNT <> 1 THEN
  ROLLBACK;
  RAISE_APPLICATION_ERROR( -20000, 'Incorrect number of rows updated for Key "Example".' )
END IF;
Run Code Online (Sandbox Code Playgroud)

要么:

DECLARE
  p_rowid ROWID;
  p_key   YOUR_TABLE.KEY%TYPE := 'Example';
BEGIN
  SELECT ROWID INTO p_rowid FROM your_table WHERE Key = p_key;

  UPDATE your_table SET Column = 'One' WHERE ROWID = p_rowid;
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    ROLLBACK;
    RAISE_APPLICATION_ERROR( -20000, 'No data found for key "'|| p_key || '".' );
  WHEN TOO_MANY_ROWS THEN
    ROLLBACK;
    RAISE_APPLICATION_ERROR( -20001, 'More than one row found for key "'|| p_key || '".' );
END;
Run Code Online (Sandbox Code Playgroud)