我们工作的开发人员一直在使用以下构造:
BEGIN
SELECT field1
INTO l_field1
FROM table1
WHERE field2 = 'some value'
EXCEPTION
WHEN NO_DATA_FOUND
THEN
SELECT field2
INTO l_field2
FROM table2
WHERE field3 = 'some value'
...
END;
基本上意味着什么 - 如果你在第一张表中找不到记录,那就去看看第二张表。
我有一种强烈的感觉,这是错误的,是一种糟糕的懒惰习惯。但是你会怎么做呢?你会先得到table1中的COUNT,如果行数为零,那么去看看table2吗?
答案 0 :(得分:0)
如果您要求其他方式,可以使用以下方式。当没有找到数据被认为处理错误或警告时,而不是条件。例外可以帮助您处理错误,如果您尝试运行多个选择并且您有错误。例外将帮助您检测到您检查以下示例。
BEGIN
declare cnt number(4);
select count(1) into cnt from table1 where field2 = 'some value';
if cnt >0 then
SELECT field1
INTO l_field1
FROM table1
WHERE field2 = 'some value'
else if cnt =0 then
SELECT field2
INTO l_field2
FROM table2
WHERE field3 = 'some value';
end if;
END;
除了例外,您可以方便地处理错误,而无需编写多个检查,如下所示:
BEGIN
SELECT ...
SELECT ...
SELECT ...
...
EXCEPTION
WHEN NO_DATA_FOUND THEN -- catches all 'no data found' errors
有关异常和处理错误的更多信息,请检查Oracle Documentation
答案 1 :(得分:0)
我反对" SELECT-in-an-EXCEPTION"东西是它嵌套没有业务嵌套的块。我的偏好是使用布尔指示符变量,类似于以下内容:
DECLARE
bNot_found BOOLEAN := FALSE;
l_field1 TABLE1.FIELD1%TYPE;
l_field2 TABLE2.FIELD2%TYPE;
BEGIN
BEGIN
SELECT field1
INTO l_field1
FROM table1
WHERE field2 = 'some value';
EXCEPTION
WHEN NO_DATA_FOUND THEN
bNot_found := TRUE;
END;
IF bNot_found THEN
SELECT field2
INTO l_field2
FROM table2
WHERE field3 = 'some value';
END IF;
-- Go thou and do good works
END;