Одно то, что можно вот так:
case
when myrec.empno=1 then v_found:=4444;
when myrec.empno=73 then v_found:=4444;
end case;
а можно и вот этак:
v_found := case
when myrec.empno=1 then 4444
when nyrec.empno=73 then 4444
end;
уже само по себе подозрительно.
А то, что в первом случае кидается case_not_found, а во втором — нет, — вообще ни в какие ворота, я считаю.
Ну то есть понять-то это можно. А простить — ни за что :)
Пример отсюда.
case
when myrec.empno=1 then v_found:=4444;
when myrec.empno=73 then v_found:=4444;
end case;
а можно и вот этак:
v_found := case
when myrec.empno=1 then 4444
when nyrec.empno=73 then 4444
end;
уже само по себе подозрительно.
А то, что в первом случае кидается case_not_found, а во втором — нет, — вообще ни в какие ворота, я считаю.
Ну то есть понять-то это можно. А простить — ни за что :)
Пример отсюда.
Омонимы (э-э... слабые, с точностью до хвостика). Течь и течь. Глагол и существительное. Оператор и выражение. Но v_found := NULL вполне приемлемо, может, так надо, вот оно и не кидается ничем. Ура, я тоже понял! :)
ReplyDeleteПро омонимы я не понял.
DeleteДа, во втором случае просто будет null. Но блин, это вот так сразу неочевидно.
Они внешне похожи, начинаются словом case. Почти омонимы.
DeleteНо первый - оператор ветвления исполнения, а второй - условное вычисление выражения, это различие уже может настораживать. Присвоить переменной "ничего" не страшно, а вот возможность послать "сам не знаю, куда" компилятор тревожит, хотя он мог бы молча идти дальше по тексту, как после switch в С, я бы вполне принял такое поведение.
Ну да, неочевидно, я вот в справочник лазал, чтобы понять, а про "принять" даже не заикался! ;)