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

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

8 ответов


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

пример:

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

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

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


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

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

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

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

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


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

  1. процедура называется блоком PL / SQL, который выполняет одну или несколько задач. где функция называется PL / SQL блок, который выполняет определенное действие.
  2. процедура может или не может возвращать значение, где функция должна возвращать одно значение.
  3. мы можем вызывать функции в инструкции Select, где в качестве процедуры мы не можем.

мертвым простым способом это делает этот смысл.

функции :

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

процедура :

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

Пример:

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;
/

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


  1. функции должны возвращать значение, процедура может возвращать одно или несколько значений с помощью параметра OUT или вообще не возвращать значение.

  2. функции могут быть вызваны из sql, где as процедуры не могут.

  3. функции предназначены для вычисления, где, как процедуры для businiess логики.

  4. процедура предварительно скомпилирована, функции-нет.

  5. процедура поддерживает deffered разрешение имени, где в качестве функции выигрыш.


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

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