В чем разница между функцией и процедурой в PL / SQL? - PullRequest
67 голосов
/ 21 апреля 2009

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

Ответы [ 7 ]

48 голосов
/ 21 апреля 2009

Процедура не имеет возвращаемого значения, тогда как функция имеет.

Пример:

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

Обратите внимание, что функция имеет предложение возврата между списком параметров и ключевым словом as. Это означает, что ожидается, что последний оператор внутри тела функции будет выглядеть примерно так:

return(my_varchar2_local_variable);

Где my_varchar2_local_variable - это некоторый varchar2, который должен быть возвращен этой функцией.

16 голосов
/ 21 апреля 2009

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

select foo
      ,fn_bar (foo)
  from foobar

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

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

1 голос
/ 31 августа 2017

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

Основные различия:

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

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

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

0 голосов
/ 31 августа 2017

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

0 голосов
/ 30 августа 2017

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

Функции:

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

Процедура:

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

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

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;
/
0 голосов
/ 02 июля 2012

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

  1. Процедура называется блоком PL / SQL, который выполняет одну или несколько задач. где функция называется блок PL / SQL, который выполняет определенное действие.
  2. Процедура может возвращать или не возвращать значение, когда функция должна возвращать одно значение.
  3. мы можем вызывать функции в операторе выбора, где в качестве процедуры мы не можем.
0 голосов
/ 29 июня 2011
  1. мы можем вызвать хранимую процедуру внутри хранимой процедуры, функцию внутри функции, StoredProcedure внутри функции, но мы не можем вызвать функцию внутри хранимой процедуры.
  2. мы можем вызвать функцию внутри оператора select.
  3. Мы можем вернуть значение из функции, не передавая выходной параметр в качестве параметра хранимой процедуре.

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

...