Процедура не возвращает значение. Функция возвращает значение, но вы не должны делать DML в функции (иначе вы не можете делать такие вещи, как ссылка на функцию в выражении SQL, вы путаете разрешения, так как обычно администраторы баз данных хотят иметь доступ к доступу только для чтения ко всем функциям, чтобы пользователи последовательно выполняли вычисления и т. д.).
Вы можете добавить параметр OUT в процедуру, чтобы вернуть статус. Если «успех» означает, что один или несколько строки были обновлены, вы можете использовать SQL% ROWCOUNT для подсчета числа строк, модифицированных предварительного заявлением SQL и использовать его для заполнения возвращаемого параметра, т.е.
CREATE OR REPLACE PROCEDURE test_proc (
p_iKey IN VARCHAR2,
p_retVal OUT INTEGER
)
AS
BEGIN
DELETE FROM myTable
WHERE theKey = p_iKey;
IF(SQL%ROWCOUNT >= 1)
THEN
p_retVal := 1;
ELSE
p_retVal := 0;
END IF;
END test_proc;
Конечно, с точки зрения ясности общего кода, я сомневаюсь в параметрах OUT, которые, кажется, пытаются вернуть код состояния. Вы, как правило, гораздо лучше обслуживаете, допуская успех и бросая исключения в случае ошибки.
2 выбирает плюс удаление? Используйте метод SQL% ROWCOUNT, предложенный stjohnrow. – 2008-11-04 18:08:18
Это довольно круто. Не знал об этом. Это определенно лучше. – 2008-11-04 18:12:14