Разница между oracle call и execute в контексте метания ошибок

у меня есть некоторая процедура, написанная в Oracle. К сожалению я не могу показать свой код. Где-то внутри него выбирается, где выполнение разбилось из-за отсутствия необходимых данных. Это выглядит так

select value into l_value
        from config
       where code = upper(p_code);

поэтому, когда я называю эту процедуру (в SqlDeveloper)

execute some_package.some_procedure('CODE');

он выдает

Error report -
ORA-01403: no data found
ORA-06512: at "XXXXXXXXXXXXXXXXXXX", line 111
ORA-06512: at "XXXXXXXXXXXXXXXXXXX", line 111
ORA-06512: at line 1
01403. 00000 -  "no data found"
*Cause:    No data was found from the objects.
*Action:   There was no data from the objects which may be due to end of fetch.

но когда я называю это

call some_package.some_procedure('CODE');

он падает в том же месте (как я могу предположить из результата, хранящегося в БД), но он делает никаких исключений.

some_package.some_procedure('CODE') succeeded.

что происходит? И почему существует такая разница?

1 ответов


NO_DATA_FOUND поведение исключения является особенным. Он обрабатывается по умолчанию в контексте SQL, но не в PL / SQL. В SQL никакие найденные данные не считаются ошибкой, все время происходит так, что нет данных, отвечающих определенному условию.

CALL является командой SQL, тогда как EXEC ярлык для BEGIN <code> END; который является PL / SQL.