2015-05-27 2 views
0

У меня есть хранимая процедура Oracle. Любой код субкода или стиля передается. В настоящее время это строки обновления, если значение не равно нулю. Я хочу добавить логику, чтобы сделать обновление только в том случае, если строки существуют в таблице, а если нет, мне нравится печатать сообщение типа «Подкод xxxx не существует» или «Код стиля xxxx не существует». Я не думаю, что здесь сливаются работы.Строки обновления Oracle Stored Procedure, если существуют записи

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

Разве вы не можете просто решить, какое сообщение для показа на основе того, является ли SQL% ROWCOUNT нулевой или ненулевой? –

+0

Спасибо Алекс. Я был ослеплен. :) – user2482822

ответ

1

Вы можете не только выполнить обновление, если оно повлияет на строки, если вы сначала запрашиваете с такими же условиями, делая счетчик; и у вас все еще может быть состояние гонки с другими сеансами, что означает, что данные могут измениться между select и update, если вы не заблокируете строки. Который все кажется немного чрезмерным и дорогостоящим.

Вы можете просто проверить значение 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; 
Смежные вопросы