Возвращенные значения из функций, которые не имеют параметров, могут использоваться из SQL-запросов (внутри оператора select или dml). Если у вас есть код, который возвращает простой примитивный тип, я рекомендую функцию.
SELECT * FROM PAYMENTS WHERE DATE = LAST_DAY_OF_MONTH(SYSDATE)
Если нужно вернуть два или несколько связанных значений, вы можете создать SQL объекта PL/и вернуть его в функцию, и он может быть использован с простой SQL тоже!
SELECT RESP.CODE, RESP.BODY FROM (SELECT GET_HTTP_RESP(URL) FROM DUAL) RESP;
Функции также могут быть вне параметров, но такие функции, как процедуры, не могут быть вызваны из SQL-запросов.
Если код действительно не должен вызываться из SQL-запроса, и вам нравится возвращать не связанные значения или значения, которые не являются основной целью этого кода, процедура может быть хорошим выбором.
Не всегда у вас есть «правильный» выбор, более похожий на вопрос о стиле программирования.
Ответ на второй вопрос: ДА. Первый вопрос - очень важная тема, чтобы знать сходства и различия, пожалуйста, изучите документацию здесь: https://docs.oracle.com/cd/B19306_01/appdev.102/b14261/subprograms.htm#i4074 – krokodilko
Какая разница вы думаете? Очевидно, что функция является чем-то вроде «upper (« x »)», а процедура - это что-то вроде 'dbms_output.put_line ('x')', и поэтому основное отличие заключается в семантике. Такие вещи, как передача по ссылке, вызов SQL и т. Д. - это детали. –