в чем основное различие процедур и функций
Чем отличаются функции от хранимых процедур в T-SQL (Microsoft SQL Server)
Приветствую всех посетителей сайта Info-Comp.ru! Сегодня мы с Вами поговорим о том, чем же отличаются функции от хранимых процедур в Microsoft SQL Server, и для наглядности сформируем итоговую таблицу отличий.
Функции и хранимые процедуры T-SQL
В Microsoft SQL Server существуют такие объекты базы данных, как функции и хранимые процедуры, которые используются для хранения неких уже реализованных алгоритмов на языке T-SQL.
Примечание! В данном материале речь идет о пользовательских функциях и хранимых процедурах, не о системных, которые уже реализованы в SQL Server, а о тех, которые создаем мы с Вами, т.е. программисты T-SQL.
Функции и хранимые процедуры используются в языке T-SQL для реализации бизнес логики, упрощения сложных SQL запросов, а также для написания различных инструкций администрирования баз данных и сервера, которые периодически необходимо выполнять.
Иными словами, функции и хранимые процедуры – это своего рода мини программы внутри базы данных, они помогают нам реализовывать нужные нам алгоритмы и хранить их в базе данных. Кроме этого, функции и хранимые процедуры позволяют декомпозировать одну глобальную задачу на несколько мелких, тем самым упрощая решение этой задачи и дальнейшее сопровождение этого решения, так как весь алгоритм становится модульным и более гибким.
У начинающих может возникнуть вопрос – а чем отличаются функции от процедур? Или это одно и то же?
Конечно же, это не одно и то же, и между этими понятиями, в контексте языка T-SQL, есть нескольких ключевых отличный.
Отличия функций от хранимых процедур в T-SQL
Давайте перейдем к рассмотрению основных отличный функций от хранимых процедур, а чтобы было более наглядно, сделаем это в виде таблицы.
Функция
Хранимая процедура
Операторы DML (INSERT, UPDATE, DELETE) для модификации данных использовать нельзя.
На сегодня это все, надеюсь, материал был Вам полезен, пока!
Pascal. Процедуры и функции
Процедуры и функции в языке Pascal являются подпрограммами. Подпрограмма – это именованная часть программы, представляющая собой некоторое собрание операторов, структурированных аналогично основной программе. Подпрограммы не необходимы, но их наличие заметно облегчает работу программиста и увеличивает «ценность» кода.
Описываются подпрограммы между разделом описания переменных и началом тела основной программы. Так выглядит структура всей программы в Pascal:
Как уже было сказано ранее, подпрограммы в Pascal представлены в лице функций и процедур, которые могут быть встроенными и пользовательскими. Первые, как правило, изначально присутствуют в системе, а вторые создаются программистом. Нас интересуют в первую очередь пользовательские подпрограммы, работа со встроенными вызывает меньше хлопот.
После описания, подпрограммой можно пользоваться посредством ее имени. При этом управление из места вызова передается соответствующей подпрограмме.
Для передачи данных, после объявления имени подпрограммы, в круглых скобках необходимо указать параметры, которые в свою очередь можно разделить на передаваемые и возвращаемые. Передаваемые параметры – это переменные, которые подпрограмма получает из главной части программы, а возвращаемые – отдает (возвращает) ей.
Также различают формальные и фактические параметры. Те, что используются при вызове процедуры или функции называются фактическими, а формальные описываются в заголовке подпрограммы, и принимают значения фактических параметров. Формальные параметры должны совпадать типом и количеством с фактическими.
Чтобы стало понятно, где находятся те или иные части подпрограмм, рассмотрим общую форму записи процедур и функций:
Процедура:
Вызов процедуры:
( );
Функция:
В Pascal, также как и во многих других языках программирования, переменные по отношению к программе делятся на локальные и глобальные. Те, которые объявляются в основной части, называются глобальными, а в процедуре или функции – локальными. Локальные переменные в отличие от глобальных могут использоваться лишь внутри подпрограммы, к которой они принадлежат.
Теперь более детально рассмотрим в отдельности каждый вид подпрограмм.
Пользовательские процедуры
Процедура – это независимая совокупность операторов, выполняющих заданную последовательность действий, и определенных отдельно от основной части программы. Она начинается со служебного слова Procedure, после которого идет имя и заголовок процедуры. Остальная часть аналогична основной программе.
Напишем пример программы, показывающей принцип работы простой процедуры.
Программа выводит сумму целых чисел заданного диапазона. Имя процедуры прописано после служебного слова, определяющего, что создана именно процедура. Далее идет заголовок, где первые две переменные – это формальные параметры, в которые передается значение от фактических k и n. Переменная rez возвращает результат и называется параметром-переменной (определяются после слова Var), а k и n – параметрами-значений. Локальная переменная – i, она описана сразу после заголовка процедуры. Вызывая, в основной части программы процедуру sum, в качестве передаваемых параметров мы указали три целочисленных переменных. Заметьте, что их количество соответствует числу формальных параметров. Порядок также важен, т. е. в переменную pk передается значение переменной k, в pn значение n и т. д.
В вышеизложенном примере было бы вполне уместным не использовать параметр-переменную rez, а определить ее локально. В этом состоит различие между процедурами и функциями в Pascal.
Пользовательские функции
В отличие от процедур, функции могут быть задействованы в основной программе, лишь в каком либо выражении. Также для обращения к функции необходимо знать тип данных результата, возвращаемого ей.
Описание функций начинается со служебного слова function, вслед за которым идет ее заголовок, а дальше те же блоки, что и у процедуры.
В вызываемую часть результат работы функции должен быть возвращен посредством имени последней. Это предусматривает хотя бы одно присвоение ей значения.
Допустим необходимо вычислить наибольший общий делитель двух целых чисел. Результатом решения данной задачи будет одно число, поэтому мы воспользуемся именно функцией.
В конце описания функции, ее имени присваивается значение, которое впоследствии примет переменная nod. Как видите, в функцию из основной части передаются только два фактических параметра (m и n), что соответствует количеству формальных параметров. И если в заголовке процедуры после слова Var можно указать переменные, также относящиеся к числу формальных параметров, то в функции эта обязанность лежит на ее имени, принимающем после своей работы какое-то значение.
Разница между процедурой и функцией в программировании
Пользователи, далекие от программирования в принципе, сталкиваются с понятиями функции и процедуры редко, и ассоциируются они с чем-то математическим и бюрократическо-медицинским. В программировании же этими понятиями оперирует множество языков, правда, даже специалисты порой не могут четко осознать разницу между функцией и процедурой. Как с тем сусликом: он есть, но его никто не видит. Посмотрим, настолько ли невидимы отличия.
Определение
Функция в программировании — подпрограмма, вызываемая из других подпрограмм необходимое число раз.
Процедура — поименованная часть программы (подпрограмма), многократно вызываемая из последующих частей программы необходимое число раз.
Сравнение
Основная разница между функцией и процедурой — в возвращаемом результате. По сути, и функции, и процедуры представляют собой логически неделимые блоки, из которых складывается код программы. Функция возвращает значение, процедура в большинстве языков программирования — нет, либо (в Си, например) возвращает пустое значение. В последнем случае (в Си) процедура считается подчиненной разновидностью функции.
Заголовок функции содержит слово “function”, идентификатор (собственное имя функции), вариативно список параметров и обязательно — тип результата. В теле функции обязательно прописывается оператор, присваивающий значение имени функции, которое она вернет в качестве результата. Заголовок процедуры содержит слово “procedure”, идентификатор (имя процедуры) и вариативно список параметров. Вызов функции осуществляется в составе выражений там, где эти выражения применяются, вызов процедуры требует отдельного оператора. Вызов процедуры осуществляется только по имени, имя функции же связано с ее значением. На схемах алгоритмов вызов функции изображается в блоке вывода или в блоке процесса, вызов процедуры — в специальном блоке “предопределенный процесс”.
Функции и процедуры. Рекурсия
Теоретический материал (Паскаль)
Понятие подпрограммы. Процедуры и функции. Стандартные подпрограммы
Подпрограммы решают три важные задачи:
Очень важно понимать, что в подпрограмму может выделяться любой законченный фрагмент программы. В качестве ориентиров просмотрите следующие рекомендации:
Подпрограммы могут быть стандартными, т.е. определенными системой, и собственными, т.е. определенными программистом.
Из набора стандартных процедур и функций по обработке одного типа информации составляются модули. Каждый модуль имеет своё имя (мы уже хорошо знакомы с модулями Crt, Graph). Доступ к процедурам и функциям модуля осуществляется при подключении этого модуля (Uses Crt, Graph).
Задание. Вызовите помощь по функции Cos и рассмотрите предоставленную информацию.
Сначала идет краткое описание подпрограммы (в одну фразу). Далее под словом Declaration (Объявление) следует интерфейсная часть процедуры или функции, которая необходима для определения типов фактических параметров. Далее под словом Target приводятся платформы, на которых может использоваться подпрограмма: Windows, real (реальный режим DOS), protected (защищенный режим DOS). После слова Remarks следуют заметки, содержащие необходимые детали использования. В разделе See Also приведены имена подпрограмм, связанных с данной по смыслу или по совместному применению. Если перемещать курсор по этим именам (они выделяются подсветкой), то, выбрав одно из них (нажав клавишу ), можно получить справку по следующей подпрограмме. Каждая процедура и функция сопровождается примером применения, переключение к которому дает последняя строка справочной информации. Любой текст из Help может быть скопирован в редактируемый файл обычными приемами копирования через буфер. Копирование примеров или заголовков функций может значительно облегчить работу.
Существует другой способ получения сведений о процедурах и функциях. Для этого нужно использовать пункт меню Help/Reserved words (зарезервированные слова) или Help/Standard units (стандартные модули).
Задание. Рассмотрите список процедур и функций, выберите какие-либо из них и ознакомьтесь со справочной информацией.
В стандартных модулях содержится большое количество подпрограмм, но невозможно создать модуль, который бы содержал все нужные программисту подпрограммы. Поэтому большую роль играют собственные подпрограммы, которые создает программист для решения конкретной задачи.
Существует два способа объединения программ и подпрограмм пользователя:
Первый способ применяется тогда, когда программа в целом не очень большая, а ее подпрограммы, скорее всего, не будут использоваться в других программах.
Структура текста подпрограммы соответствует структуре текста основной программы за двумя исключениями:
Вызов подпрограммы происходит при каждом употреблении ее имени в основной (или вызывающей) программе. При вызове подпрограммы выполнение основной программы приостанавливается, и управление передается в подпрограмму, где выполняются команды, заданные в ней. Подпрограмма завершается, если выполнены все ее операторы до завершающего слова End или по специальной команде выхода из подпрограммы Exit. По окончании работы подпрограммы управление возвращается основной программе, а именно, первой команде, следующей за обращением к этой подпрограмме.
Например, вызов функции
вернет в основную программу значение наименьшего из двух чисел и это значение будет присвоено переменной M.
Все переменные, которые использует подпрограмма, могут быть либо глобальными, либо локальными.
Определение. Глобальными называются переменные, объявленные в основной программе и доступные как программе, так и всем ее подпрограммам.
Определение. Локальными называются переменные, объявленные внутри подпрограммы и доступные только ей самой.
Обмен информацией между основной программой и подпрограммой может осуществляться только с помощью глобальных переменных и с помощью параметров подпрограммы.
Подпрограмма может использовать любые глобальные переменные кроме тех, которые имеют те же имена, что и ее локальные переменные. Если в подпрограмме описана локальная переменная, имя которой совпадает с именем некоторой глобальной переменной, то данная глобальная переменная становится недоступной в этой подпрограмме, и при указании идентификатора переменной произойдет обращение к локальной переменой подпрограммы, а не одноименной глобальной переменной. Память для локальных (т.е. описанных в подпрограмме) переменных выделяется на время исполнения данной подпрограммы в специальной области, называемой стеком. При завершении работы подпрограммы память освобождается, поэтому все внутренние результаты работы подпрограммы не сохраняются от одного обращения к другому.
Если говорить о плюсах использования подпрограмм, то можно назвать следующие:
В языке Паскаль выделяют два вида подпрограмм: процедуры (Procedure) и функции (Function). Любая программа может содержать несколько процедур и функций. Структура любой подпрограммы аналогична структуре всей программы.
Подпрограмма должна быть описана до того, как будет использована в программе или другой подпрограмме.
Процедуры и функции объявляются в разделе описания вслед за разделом переменных.
Общая структура программы выглядит так:
Выполнение программы начинается с операторов основной программы. При необходимости вызывается подпрограмма, и начинают действовать её операторы. Затем управление возвращается в основную программу, которая и продолжает выполняться.
Подпрограмма вызывается по своему имени с указанием необходимых параметров.
На этом занятии рассмотрим примеры организации наиболее простого вызова подпрограмм.
Задание. Рассмотрите решение предложенных задач, наберите программы на компьютере, проверьте их работоспособность, внесите свои изменения и дополните своими комментариями.
Задача 1. Написать программу, состоящую из трех подпрограмм и основной программы. Подпрограммы должны организовывать ввод чисел, вычисление их суммы и вывод результата.
Задача 2. Найти среднее арифметическое двух чисел.
В чем разница между «функцией» и «процедурой»?
вообще говоря, мы все слышим о функции или процедуры в языках программирования. Однако я только что узнал, что я использую эти термины почти взаимозаменяемо (что, вероятно, очень неправильно).
в чем разница с точки зрения их функциональности, их назначения и использования?
пример был бы признателен.
17 ответов:
функция возвращает значение, а процедура просто выполняет команды.
имя функции происходит от математики. Он используется для вычисления значения на основе входных данных.
процедура-это набор команд, которые могут быть выполнены по порядку.
в большинстве языков программирования, даже функции могут иметь набор команд. Следовательно, разница заключается только в возврате части значения.
но если вы хотите сохранить функцию в чистоте, (просто посмотрите на функциональные языки), вам нужно убедиться, что функция не имеет побочного эффекта.
в языках, подобных Паскалю, функции и процедуры являются различными сущностями, отличающимися тем, возвращают ли они значение или нет. Они ведут себя по-разному относительно. синтаксис языка (например. процедура вызывает операторы формы; вы не можете использовать вызов процедуры внутри выражения, а вызовы функций не формируют операторы, вы должны использовать их в других операторах). Поэтому программисты, воспитанные Паскалем, различают их.
В C-like языки и многие другие современные языки, это различие исчезло; в статически типизированных языках процедуры-это просто функции с забавным типом возврата. Вероятно, поэтому они взаимозаменяемы.
хотя вы должны отметить, что стандарт C не говорит о процедурах, а только о функциях.
В общем, процедура представляет собой последовательность инструкций.
Функция может быть такой же, но она обычно возвращает результат.
есть такой термин подпрограмма или подпрограмма что означает параметризованный фрагмент кода, который может быть вызван из разных мест.
функции и процедуры реализации этих. Обычно функции возвращают значения, а процедуры ничего не возвращают.
Основные Различия
Дополнительные Различия
в SQL:
более строго, функция f подчиняется свойству, что f(x) = f (y), если x = y, т. е. она вычисляет тот же результат каждый раз он вызывается с одним и тем же аргументом (и, таким образом, он не изменяет состояние системы.)
таким образом, rand() или print(«Hello») и т. д. не функции, а процедуры. В то время как sqrt(2.0) должен быть функцией: нет никакого наблюдаемого эффекта или изменения состояния независимо от того, как часто его вызывают, и он всегда возвращает 1.41 и некоторые.
внутри процедуры мы можем использовать операторы DML (Insert /Update/Delete), но внутри функции мы не можем использовать операторы DML.
процедура может иметь оба входных\выходных параметра, но функция может иметь только входной параметр.
мы можем использовать блок Try-Catch в хранимой процедуре, но в функции мы не можем использовать блок Try-Catch.
мы не можем использовать хранимую процедуру в инструкции Select, но в функции мы можем использовать в инструкции Select.
сохраненные Процедура может возвращать 0 или n значений (максимум 1024), но функция может возвращать только 1 значение, которое является обязательным.
хранимая процедура не может быть вызвана из функции, но мы можем вызвать функцию из хранимой процедуры.
мы можем использовать транзакцию в хранимой процедуре, но в функции мы не можем использовать транзакцию.
мы не можем использовать хранимую процедуру в инструкции Sql в любом месте в разделе Where/Having/select, но в функции мы можем использовать.
мы не можем присоединиться Хранимая процедура, но мы можем присоединиться к функции.
в большинстве случаев: функция возвращает значение, а процедура нет. Оба куска кода сгруппированы вместе, чтобы сделать то же самое.
в контексте функционального программирования (где все функции возвращают значения), функция является абстрактным объектом:
здесь f-та же функция, что и g, но это другая процедура.
Если мы здесь языковые агностики,процедура обычно определяет ряд действий, необходимых для надежного и идемпотентного достижения определенного результата. То есть процедура-это в основном алгоритм.
функции, с другой стороны, несколько независимых частей кода в рамках более крупной программы. Другими словами, функция-это реализация процедуры.
функция возвращает значение, а процедура просто выполняет команды.
имя функции происходит от математики. Он используется для вычисления значения на основе входных данных.
процедура-это набор команд, которые могут быть выполнены по порядку.
в большинстве языков программирования, даже функции могут иметь набор команд. Следовательно, разница заключается только в возврате части значения.
но если вы хотите сохранить функцию в чистоте, (просто посмотрите на функциональные языки), вам нужно убедиться, что функция не имеет побочного эффекта.
функция может использоваться в инструкции sql, тогда как процедура не может использоваться в инструкции sql.
инструкции Insert, Update и Create не могут быть включены в функцию, но процедура может иметь эти инструкции.
процедура поддерживает транзакции, но функции не поддерживают транзакции.
функция должна возвращать одно и только одно значение (другое может быть возвращено переменной OUT), но процедура возвращает столько наборов данных и возвращает ценности.
планы выполнения обеих функций и процедур кэшируются, поэтому производительность одинакова в обоих случаях.
Я возражаю с чем-то, что я продолжаю видеть снова и снова в большинстве этих ответов, что делает функцию функцией, так это то, что она возвращает значение.
функция-это не просто метод, который возвращает значение. Не так: чтобы метод был реальной функцией, он должен возвращать одно и то же значение, всегда заданное конкретным входом. Примером метода, который не является функцией, является random метод в большинстве языков, потому что, хотя он возвращает значение значение не всегда тот же.
вот еще один пример метода, который не является функцией, но в противном случае все равно вернет a значение.
Я также возражаю против того, что процедуры не возвращают значения. Процедура-это просто определенный способ говорить о функции или метода. Таким образом, это означает, что если базовый метод, который ваша процедура определяет или реализует, возвращает значение, то угадайте, что эта процедура возвращает значение. Возьмем для примера следующий фрагмент SICP:
вы много слышали о рекурсивных процедурах в последнее время? Они разговаривают о рекурсивной функции (реальной функции), и она возвращает значение, и они используют слово «процедура». Так в чем же тогда разница?
(Примечание, Если Вы читаете эту главу по ссылке, которую я вам предоставляю, вы можете обнаружьте, что более трудное для понимания понятие-это не различие между функцией и процедурой, а процесс и процедура. Знаете ли вы, что рекурсивная процедура может иметь итерационный процесс?)
представление этой машины может выглядеть как
конечно, это не единственный способ сделать пирог.
в этом случае мы видим, что:
эта аналогия в порядке, но она ломается, когда вы принимаете во внимание, что когда вы имеете дело с компьютерной программой, все является абстракцией. Так что в отличие от рецепта с машиной мы сравниваем две вещи, которые сами по себе являются абстракциями; две вещи, которые могли бы быть тем же самым. И я держу это они (для всех намерений и целей) одно и то же.
в контексте db: Хранимая процедура-это precompiled план выполнения, где as функции не являются.