2009-04-21 3 views
62

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

+13

Я бы не согласился с тем, что это дубликат. В общем, термины языка программирования, такие как процедура и функция, не используются одинаково в системе баз данных. Это хороший вопрос, просто ответ «такая же разница, как и с языками программирования: см. <Другой вопрос>». –

+1

У кого-нибудь есть список различий, так как оракул 11g и вперед? Я думаю, теперь мы можем использовать некоторые дополнительные функции в функциях! – MozenRath

ответ

45

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

Пример:

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(my_varchar2_local_variable); 

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

+14

Как небольшое пояснение, вы все равно можете получить значения OUT из процедуры - на самом деле вы можете получить возвращаемое значение для каждого указанного параметра OUT. – GoingTharn

15

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

select foo 
     ,fn_bar (foo) 
    from foobar 

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

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

+0

Возможно, это не имеет смысла, но оптимизатор не мешает вам использовать функции без детерминизма в любом месте. –

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

Это то, что я нашел. Пожалуйста, дайте мне знать, если они есть.

+1

Вы ошибаетесь - нет причин, по которым вы не можете вызвать функцию из процедуры. –

-1

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

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

Не может ли функция выполнить более одного действия? Он _returns_ только тип данных. – Ben

-1

Простым способом это делает это значение.

Функции:

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

Процедура:

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

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

CREATE OR REPLACE PROCEDURE greetings 

BEGIN 

dbms_output.put_line('Hello World!'); 

END ; 
/

Выполнение процедуры Standalone: ​​

Автономная процедура может быть вызвана двумя способами:

• Использование 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

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

Основных отличий:

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

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

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

-1

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

Смежные вопросы