“找到数据”没有内置错误,因为 Oracle 不认为查找数据是错误。但是,在特定情况下将这种情况视为错误并不太难。
这在一定程度上取决于您想对异常做什么。如果您想在过程中以某种方式对其做出反应,您可以定义自己的异常,然后引发它:
PROCEDURE check_assigned AS
exception err_data_found;
placeholder INT;
BEGIN
SELECT v.id
INTO placeholder
FROM vinegar v
WHERE NOT EXISTS
(SELECT 1
FROM home h
WHERE h.sid = v.sid);
IF SQL%FOUND THEN
RAISE err_data_found;
END IF;
EXCEPTION
WHEN err_data_found THEN
NULL;
--do something
END;
另一方面,如果你只是想将错误返回给调用者,你可以使用raise_application_error:
PROCEDURE check_assigned AS
placeholder INT;
BEGIN
SELECT v.id
INTO placeholder
FROM vinegar v
WHERE NOT EXISTS
(SELECT 1
FROM home h
WHERE h.sid = v.sid);
IF SQL%FOUND THEN
raise_application_error (-20001,
'Data was found in the vinegar table.');
END IF;
END;
如果目标是在存在任何行时引发错误并继续,那么这样做有点危险,因为您可能会触发NO_DATA_FOUND 或TOO_MANY_ROWS。您可以通过选择 cmets 中建议的计数来解决此问题,但我更喜欢使用显式光标来避免这些问题。
PROCEDURE check_assigned AS
placeholder INT;
CURSOR cur_vinegar_check IS
SELECT v.id
INTO placeholder
FROM vinegar v
WHERE NOT EXISTS
(SELECT 1
FROM home h
WHERE h.sid = v.sid)
AND ROWNUM = 1;
BEGIN
OPEN cur_vinegar_check;
FETCH cur_vinegar_check INTO placeholder;
IF SQL%FOUND THEN
raise_application_error (-20001,
'Data was found in the vinegar table.');
END IF;
CLOSE cur_vinegar_check;
END check_assigned;
您会注意到我在查询中添加了AND ROWNUM = 1。这是rownum 在外部查询中可预测的少数情况之一:您只关心是否存在行;你不在乎它是哪一行。如果您有可能会返回大量行,这会带来显着的性能优势。