Зависит от того, что вы подразумеваете под «правильным». То, что вы представили, синтаксически верно, да. Но вы не сказали нам, что на самом деле хотите, чтобы мы произошли, поэтому мы не можем сказать, будет ли код, который вы разместили, действительно делать то, что вы хотите.
С точки зрения бизнес-логики, уверены ли вы, что это действительно не ошибка, если ваш SELECT INTO возвращает 0 строк? Если вы ловите и проглатываете исключение, это означает, что вы знаете, что это на самом деле не ошибка. Однако если вы кодируете SELECT INTO, это означает, что вы ожидаете ровно одну строку. Конечно, возможно, что оба эти утверждения верны, но более распространенным является то, что это действительно исключение и что его не следует просто проглотить и игнорировать.
В целом, я бы предпочел поместить обработчик исключений как можно ближе к запросу, который может вызвать исключение, насколько это возможно. Я бы нашел чище иметь что-то вроде
IF condition1
THEN
BEGIN
<<select statement>>
EXCEPTION
WHEN no_data_found
THEN
<<do something>>
END;
IF condition2
THEN
...
END IF;
END IF;
Таким образом, если в вашей процедуре окажется несколько мест, где может быть сгенерировано исключение NO_DATA_FOUND, будет ясно, какие исключения ожидаются, а какие - неожиданные.
Когда вы дойдете до того, чтобы иметь три уровня вложенных операторов IF, я склонен подозревать, что вы хотите реорганизовать код в несколько процедур, чтобы сделать код более понятным. Например, вместо того, чтобы иметь вложенный блок PL / SQL, который выполняет инструкцию SELECT, перехватывает исключение и обрабатывает исключение, вероятно, было бы яснее иметь отдельную функцию, которая выполняла бы все это, а затем вызывать эту функцию из своего триггера.