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

时间:2015-05-27 21:55:39

标签: stored-procedures oracle11g

我有以下Oracle存储过程。传入子代码或样式代码。目前,如果value不为null,则为更新行。我想添加逻辑,以便只有在表上存在行时才进行更新,如果没有,我喜欢打印“子代码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;

1 个答案:

答案 0 :(得分: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;