Monday, March 5, 2018

Ыйд он и есть ыйд

Одно то, что можно вот так:
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, а во втором — нет, — вообще ни в какие ворота, я считаю.
Ну то есть понять-то это можно. А простить — ни за что :)

Пример отсюда.

3 comments:

  1. Омонимы (э-э... слабые, с точностью до хвостика). Течь и течь. Глагол и существительное. Оператор и выражение. Но v_found := NULL вполне приемлемо, может, так надо, вот оно и не кидается ничем. Ура, я тоже понял! :)

    ReplyDelete
    Replies
    1. Про омонимы я не понял.

      Да, во втором случае просто будет null. Но блин, это вот так сразу неочевидно.

      Delete
    2. Они внешне похожи, начинаются словом case. Почти омонимы.

      Но первый - оператор ветвления исполнения, а второй - условное вычисление выражения, это различие уже может настораживать. Присвоить переменной "ничего" не страшно, а вот возможность послать "сам не знаю, куда" компилятор тревожит, хотя он мог бы молча идти дальше по тексту, как после switch в С, я бы вполне принял такое поведение.

      Ну да, неочевидно, я вот в справочник лазал, чтобы понять, а про "принять" даже не заикался! ;)

      Delete