В чем разница между функцией и процедурой в PL/SQL?

В чем разница между функцией и процедурой в PL/SQL?


person Tony    schedule 21.04.2009    source источник
comment
Я бы не согласился с тем, что это дубликат. В общем, термины языка программирования, такие как процедура и функция, не используются в системе баз данных одинаково. Это хороший вопрос, просто ответ такой же, как и с языками программирования: см. ‹другой вопрос›.   -  person John Saunders    schedule 21.04.2009
comment
есть ли у кого список отличий начиная с oracle 11g и далее? Я думаю, что теперь мы можем использовать некоторые дополнительные функции в функциях!   -  person MozenRath    schedule 26.12.2013


Ответы (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, который должен быть возвращен этой функцией.

person Petros    schedule 21.04.2009
comment
Небольшое пояснение: вы по-прежнему можете получать значения OUT из процедуры — фактически вы можете иметь возвращаемое значение для каждого указанного вами параметра OUT. - person GoingTharn; 04.06.2009

Функция может быть встроена в оператор SQL, например.

select foo
      ,fn_bar (foo)
  from foobar

Чего нельзя сделать с помощью хранимой процедуры. Архитектура оптимизатора запросов ограничивает то, что можно сделать с функциями в этом контексте, требуя, чтобы они были чистыми (т. е. одни и те же входные данные всегда давали один и тот же результат). Это ограничивает то, что можно сделать в функции, но позволяет использовать ее в строке запроса, если она определена как «чистая».

В противном случае функция (не обязательно детерминированная) может возвращать переменную или набор результатов. Если функция возвращает набор результатов, вы можете соединить его с каким-либо другим выбором в запросе. Однако вы не можете использовать недетерминированную функцию, подобную этой, в коррелированном подзапросе, поскольку оптимизатор не может предсказать, какой набор результатов будет возвращен (это сложно решить с точки зрения вычислений, как и проблема остановки).

person ConcernedOfTunbridgeWells    schedule 21.04.2009
comment
Это может не иметь смысла, но оптимизатор не мешает вам использовать недетерминированные функции где угодно. - person Jon Heller; 29.06.2013

В мертвой простоте это делает это значение.

Функции:

Эти подпрограммы возвращают одно значение; в основном используется для вычисления и возврата значения.

Процедура:

Эти подпрограммы не возвращают значение напрямую; в основном используется для выполнения действия.

Пример программы:

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;
/
person Dulith De Costa    schedule 30.08.2017

И хранимые процедуры, и функции представляют собой именованные блоки, которые находятся в базе данных и могут выполняться по мере необходимости.

Основные отличия:

  1. Хранимая процедура может при необходимости возвращать значения с использованием выходных параметров, но также может быть написана таким образом, чтобы не возвращалось значение. Но функция должна возвращать значение.

  2. Хранимая процедура не может использоваться в инструкции SELECT, тогда как функция может использоваться в инструкции SELECT.

С практической точки зрения я бы выбрал хранимую процедуру для определенной группы требований и функцию для общего требования, которую можно использовать в нескольких сценариях. Например: сравнение двух строк, их обрезка или взятие последней части, если у нас есть функция для этого, мы могли бы глобально использовать ее для любого приложения, которое у нас есть.

person Aparna    schedule 31.08.2017

Ниже приведены основные различия между процедурой и функцией.

  1. Процедура называется блоком PL/SQL, который выполняет одну или несколько задач. где функция называется блоком PL/SQL, который выполняет определенное действие.
  2. Процедура может возвращать или не возвращать значение, тогда как функция as должна возвращать одно значение.
  3. мы можем вызывать функции в операторе select, где в качестве процедуры мы не можем.
person mohan    schedule 02.07.2012
comment
Не может ли функция выполнять более одного действия? Он возвращает только тип данных. - person Ben; 02.07.2012

В двух словах - функция что-то возвращает. Вы можете использовать функцию в SQL-запросе. Процедура является частью кода для выполнения каких-либо действий с данными, но вы не можете вызвать процедуру из запроса, вы должны запустить ее в блоке PL/SQL.

person Tomek Krasuski    schedule 31.08.2017

  1. мы можем вызвать хранимую процедуру внутри хранимой процедуры, функцию внутри функции, хранимую процедуру внутри функции, но мы не можем вызвать функцию внутри хранимой процедуры.
  2. мы можем вызвать функцию внутри оператора select.
  3. Мы можем вернуть значение из функции, не передавая выходной параметр в качестве параметра хранимой процедуре.

Вот в чем разница, которую я нашел. Пожалуйста, дайте мне знать, если таковые имеются.

person Pearl    schedule 29.06.2011
comment
Вы не правы - нет причин, по которым вы не можете вызвать функцию из процедуры. - person Bob Jarvis - Reinstate Monica; 16.06.2016