我剛剛發現,如果您有引發TOO_MANY_ROWS異常的SELECT INTO,則該變量仍將從查詢檢索到的第一條記錄中獲取值。那是預期的行爲?TOO_MANY_ROWS引發,但變量仍然獲得值
這裏是我的例子:
for co in my_cursor loop
l_sco_db_id := null;
begin
select db_id
into l_sco_db_id
from objects_tab
where object_name = co.object_name;
exception
when no_data_found then
dbms_output.put_line('No objects_tab record found for Object ' || co.object_name);
when too_many_rows then
dbms_output.put_line('Multiple objects_tab records found for Object ' || co.object_name);
l_sco_db_id := null;
end;
end loop;
這是一個循環裏面,所以我設置變量空之初,以確保它是空白,但我不得不再次明確地做在WHEN TOO_MANY_ROWS例外,我沒有想到。我的同事(至少,那些即時聽到的)沒有一個人期望變量具有價值。
不知何故,它並沒有讓我吃驚。 Oracle在處理第一行時很高興。遇到第二行時會引發錯誤。 –
它令我感到驚訝。人們會期望(我認爲)查詢將被運行,行將被計數,並且只有在該值恰好分配給一行時。從您描述的第一行開始讀取,將值分配給您的變量,然後運行時找到更多行時發出抱怨。這看起來很奇怪。 – mathguy
是的,它讓我感到驚訝@mathguy – pahariayogi