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语句中添加什么,或者这是否是一个好方法。那么,实现这一目标的最优雅的方法是什么?
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)
| 归档时间: |
|
| 查看次数: |
1728 次 |
| 最近记录: |