В чем разница между функцией и процедурой в PL/SQL?
В чем разница между функцией и процедурой в PL/SQL?
Ответы (7)
У процедуры нет возвращаемого значения, а у функции есть.
Пример:
CREATE OR REPLACE PROCEDURE my_proc
(p_name IN VARCHAR2 := 'John') as begin ... end
CREATE OR REPLACE FUNCTION my_func
(p_name IN VARCHAR2 := 'John') return varchar2 as begin ... end
Обратите внимание, что функция имеет предложение return между списком параметров и ключевым словом as. Это означает, что ожидается, что последний оператор внутри тела функции будет читать что-то вроде:
return(my_varchar2_local_variable);
Где my_varchar2_local_variable — это некоторый varchar2, который должен быть возвращен этой функцией.
Функция может быть встроена в оператор SQL, например.
select foo
,fn_bar (foo)
from foobar
Чего нельзя сделать с помощью хранимой процедуры. Архитектура оптимизатора запросов ограничивает то, что можно сделать с функциями в этом контексте, требуя, чтобы они были чистыми (т. е. одни и те же входные данные всегда давали один и тот же результат). Это ограничивает то, что можно сделать в функции, но позволяет использовать ее в строке запроса, если она определена как «чистая».
В противном случае функция (не обязательно детерминированная) может возвращать переменную или набор результатов. Если функция возвращает набор результатов, вы можете соединить его с каким-либо другим выбором в запросе. Однако вы не можете использовать недетерминированную функцию, подобную этой, в коррелированном подзапросе, поскольку оптимизатор не может предсказать, какой набор результатов будет возвращен (это сложно решить с точки зрения вычислений, как и проблема остановки).
В мертвой простоте это делает это значение.
Функции:
Эти подпрограммы возвращают одно значение; в основном используется для вычисления и возврата значения.
Процедура:
Эти подпрограммы не возвращают значение напрямую; в основном используется для выполнения действия.
Пример программы:
CREATE OR REPLACE PROCEDURE greetings
BEGIN
dbms_output.put_line('Hello World!');
END ;
/
Выполнение отдельной процедуры:
Автономную процедуру можно вызвать двумя способами:
• Использование ключевого слова EXECUTE
• Вызов процедуры из блока PL/SQL.
Процедуру также можно вызвать из другого блока PL/SQL:
BEGIN
greetings;
END;
/
Функция:
CREATE OR REPLACE FUNCTION totalEmployees
RETURN number IS
total number(3) := 0;
BEGIN
SELECT count(*) into total
FROM employees;
RETURN total;
END;
/
Следующая программа вызывает функцию totalCustomers
из другого блока
DECLARE
c number(3);
BEGIN
c := totalEmployees();
dbms_output.put_line('Total no. of Employees: ' || c);
END;
/
И хранимые процедуры, и функции представляют собой именованные блоки, которые находятся в базе данных и могут выполняться по мере необходимости.
Основные отличия:
Хранимая процедура может при необходимости возвращать значения с использованием выходных параметров, но также может быть написана таким образом, чтобы не возвращалось значение. Но функция должна возвращать значение.
Хранимая процедура не может использоваться в инструкции SELECT, тогда как функция может использоваться в инструкции SELECT.
С практической точки зрения я бы выбрал хранимую процедуру для определенной группы требований и функцию для общего требования, которую можно использовать в нескольких сценариях. Например: сравнение двух строк, их обрезка или взятие последней части, если у нас есть функция для этого, мы могли бы глобально использовать ее для любого приложения, которое у нас есть.
Ниже приведены основные различия между процедурой и функцией.
- Процедура называется блоком PL/SQL, который выполняет одну или несколько задач. где функция называется блоком PL/SQL, который выполняет определенное действие.
- Процедура может возвращать или не возвращать значение, тогда как функция as должна возвращать одно значение.
- мы можем вызывать функции в операторе select, где в качестве процедуры мы не можем.
В двух словах - функция что-то возвращает. Вы можете использовать функцию в SQL-запросе. Процедура является частью кода для выполнения каких-либо действий с данными, но вы не можете вызвать процедуру из запроса, вы должны запустить ее в блоке PL/SQL.
- мы можем вызвать хранимую процедуру внутри хранимой процедуры, функцию внутри функции, хранимую процедуру внутри функции, но мы не можем вызвать функцию внутри хранимой процедуры.
- мы можем вызвать функцию внутри оператора select.
- Мы можем вернуть значение из функции, не передавая выходной параметр в качестве параметра хранимой процедуре.
Вот в чем разница, которую я нашел. Пожалуйста, дайте мне знать, если таковые имеются.