如果记录存在,Oracle 存储过程会更新行

Posted

技术标签:

【中文标题】如果记录存在,Oracle 存储过程会更新行【英文标题】:Oracle Stored Procedure update rows if records exist 【发布时间】:2015-05-27 21:55:38 【问题描述】:

我有以下 Oracle 存储过程。传入子代码或样式代码。当前如果值不为空,则更新行。我想添加逻辑以便仅在表上存在行时才进行更新,如果不存在,我喜欢打印诸如“子代码 xxxx 不存在”或“样式代码 xxxx 不存在”之类的消息。我不认为在这里合并到作品中。

create or replace PROCEDURE "REMOVE_PRICES"
(
  RESULT OUT VARCHAR2 
  , STYLECODE_ IN NUMBER 
  , SUBCODE_ IN NUMBER 
) AS 
BEGIN
IF (SUBCODE_ is null AND STYLECODE_ is null)
THEN
    raise_application_error(-20005, 'ERROR: Please provide either SUBCODE or STYLECODE!');
END IF;
IF SUBCODE_ IS NOT NULL THEN
  UPDATE prices
  SET type = null
  WHERE subcode=SUBCODE_;
  RESULT := SQL%ROWCOUNT || ' price for subcode ' || SUBCODE_ || ' is    removed';

ELSIF STYLECODE_ IS NOT NULL THEN
  UPDATE prices
  SET type = null
  WHERE stylecode=STYLECODE_;
  RESULT := SQL%ROWCOUNT || ' price for stylecode ' || STYLECODE_ || ' is removed';
END IF;
END REMOVE_PRICES;

【问题讨论】:

你不能根据 SQL%ROWCOUNT 是零还是非零来决定显示哪条消息吗? 谢谢亚历克斯。我被蒙蔽了。:) 【参考方案1】:

如果更新会影响行,则不能只选择进行更新,除非您先使用相同的条件进行查询,然后进行计数;并且您仍然可能与其他会话存在竞争条件,这意味着数据可能会在 selectupdate 之间更改,除非您锁定行。这一切似乎有点过分和昂贵。

您可以检查SQL%ROWCOUNT 的值,如果为零则显示该消息,否则显示您当前的消息:

IF SUBCODE_ IS NOT NULL THEN
  UPDATE prices
  SET type = null
  WHERE subcode=SUBCODE_;
  IF SQL%ROWCOUNT = 0 then
    RESULT := 'The subcode ' || SUBCODE || ' does not exist';
  ELSE
    RESULT := SQL%ROWCOUNT || ' price for subcode ' || SUBCODE_ || ' is removed';
  END IF;
ELSIF STYLECODE_ IS NOT NULL THEN
  UPDATE prices
  SET type = null
  WHERE stylecode=STYLECODE_;
  IF SQL%ROWCOUNT = 0 then
    RESULT := 'The stylecode ' || STYLECODE || ' does not exist';
  ELSE
    RESULT := SQL%ROWCOUNT || ' price for stylecode ' || STYLECODE_ || ' is removed';
  END IF;
END IF;

【讨论】:

以上是关于如果记录存在,Oracle 存储过程会更新行的主要内容,如果未能解决你的问题,请参考以下文章

oracle 存储过程

求教oracle存储过程的赋值和更新

oracle 存储过程 空值赋值问题

oracle 有记录就更新没有添加问题

Oracle 存储过程 删除表记录时删除不存在的记录也是显示删除成功

一个存储过程中更新多个表可以用一个COMMIT吗 ?