Что такое хранимая процедура?

298

Что такое «хранимая процедура» и как они работают?

Какова структура хранимой процедуры (каждая вещь должна быть хранимой процедурой)?

M--
источник

Ответы:

243

Хранимые процедуры представляют собой пакет SQL-операторов, которые могут быть выполнены несколькими способами. Большинство основных СУБД поддерживают хранимые процедуры; однако не все так делают. Вам нужно будет проверить с вашей конкретной справочной документацией СУБД для специфики. Поскольку я больше всего знаком с SQL Server, я буду использовать его в качестве примера.

Чтобы создать хранимую процедуру, синтаксис довольно прост:

CREATE PROCEDURE <owner>.<procedure name>

     <Param> <datatype>

AS

     <Body>

Так, например:

CREATE PROCEDURE Users_GetUserInfo

    @login nvarchar(30)=null

AS

    SELECT * from [Users]
    WHERE ISNULL(@login,login)=login

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

Хранимые процедуры имеют свои недостатки, в основном это обслуживание, связанное с вашей основной операцией CRUD . Допустим, для каждой таблицы у вас есть Вставка, Обновление, Удалить и хотя бы один выбор на основе первичного ключа, это означает, что в каждой таблице будет 4 процедуры. Теперь возьмите базу данных достойного размера из 400 таблиц, и у вас будет 1600 процедур! И это при условии, что у вас нет дубликатов, которые вы, вероятно, будете иметь.

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

JoshBerke
источник
1
Ты имеешь в виду Хранимую Процедуру, чтобы читать данные и ORMлюбить Entity Frameworkделать CRUDоперации?
Shaijut
2
Да, это один из возможных подходов. Мы используем ORM для всего, кроме отчетов
JoshBerke
Для получения более подробной информации о хранимых процедурах вы можете обратиться к моему URL techflirt.com/mysql-stored-procedure-tutorial
Кумар Сингх
150

Хранимая процедура - это набор предварительно скомпилированных операторов SQL, которые используются для выполнения специальной задачи.

Пример: если у меня есть Employeeстол

Employee ID  Name       Age  Mobile
---------------------------------------
001          Sidheswar  25   9938885469
002          Pritish    32   9178542436

Сначала я получаю Employeeтаблицу:

Create Procedure Employee details
As
Begin
    Select * from Employee
End

Чтобы запустить процедуру на SQL Server:

Execute   Employee details

--- (Employee details is a user defined name, give a name as you want)

Затем, во-вторых, я вставляю значение в таблицу сотрудников

Create Procedure employee_insert
    (@EmployeeID int, @Name Varchar(30), @Age int, @Mobile int)
As
Begin
    Insert Into Employee
    Values (@EmployeeID, @Name, @Age, @Mobile)
End

Чтобы запустить параметризованную процедуру на SQL Server:

Execute employee_insert 003,’xyz’,27,1234567890

  --(Parameter size must be same as declared column size)

Пример: @Name Varchar(30)

В Employeeтаблице Nameразмер столбца должен быть varchar(30).

sidhewsar
источник
1
пример, который легко понять
HaFiz Umer
80

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

Пример создания хранимой процедуры

CREATE PROCEDURE test_display
AS
    SELECT FirstName, LastName
    FROM tb_test;

EXEC test_display;

Преимущества использования хранимых процедур

  • Хранимая процедура позволяет модульное программирование.

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

  • Хранимая процедура позволяет быстрее выполнять.

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

  • Хранимая процедура может уменьшить сетевой трафик.

    Операция, требующая сотен строк кода Transact-SQL, может быть выполнена с помощью одного оператора, который выполняет код в процедуре, а не путем отправки сотен строк кода по сети.

  • Хранимые процедуры обеспечивают лучшую безопасность ваших данных

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

    В SQL Server у нас есть разные типы хранимых процедур:

    • Системные хранимые процедуры
    • Пользовательские хранимые процедуры
    • Расширенные хранимые процедуры
  • Системные процедуры хранятся в базе данных master и начинаются с sp_префикса. Эти процедуры могут использоваться для выполнения различных задач по поддержке функций SQL Server для вызовов внешних приложений в системных таблицах.

    Пример: sp_helptext [StoredProcedure_Name]

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

  • Расширенные хранимые процедуры - это процедуры, вызывающие функции из файлов DLL. В настоящее время расширенные хранимые процедуры не рекомендуется использовать по той причине, что было бы лучше избегать использования расширенных хранимых процедур.

Kanwar Singh
источник
37

Обычно хранимая процедура является «функцией SQL». У них есть:

-- a name
CREATE PROCEDURE spGetPerson
-- parameters
CREATE PROCEDURE spGetPerson(@PersonID int)
-- a body
CREATE PROCEDURE spGetPerson(@PersonID int)
AS
SELECT FirstName, LastName ....
FROM People
WHERE PersonID = @PersonID

Это пример, ориентированный на T-SQL. Хранимые процедуры могут выполнять большинство операторов SQL, возвращать скалярные и табличные значения и считаются более безопасными, поскольку они предотвращают атаки с использованием SQL-инъекций.

Дейв Сверски
источник
16

Подумайте о такой ситуации,

  • У вас есть база данных с данными.
  • Существует ряд различных приложений, необходимых для доступа к этой центральной базе данных, и в будущем некоторые новые приложения тоже.
  • Если вы собираетесь вставить встроенные запросы к базе данных для доступа к центральной базе данных, внутри кода каждого приложения в отдельности, то, вероятно, вам придется повторять один и тот же запрос снова и снова внутри кода разных приложений.
  • В такой ситуации вы можете использовать хранимые процедуры (SP). С помощью хранимых процедур вы пишете несколько общих запросов (процедур) и сохраняете их в центральной базе данных.
  • Теперь дублирование работы никогда не произойдет, как раньше, и доступ к данным и обслуживание будут осуществляться централизованно.

НОТА:

  • В описанной выше ситуации вы можете задаться вопросом: «Почему мы не можем ввести центральный сервер доступа к данным для взаимодействия со всеми приложениями? Да. Это будет возможной альтернативой. Но,
  • Основным преимуществом SP по сравнению с этим подходом является то, что, в отличие от вашего кода доступа к данным со встроенными запросами, SP - это предварительно скомпилированные операторы, поэтому они будут выполняться быстрее. А расходы на связь (по сетям) будут как минимум.
  • В противоположность этому, SP добавят дополнительную нагрузку на сервер базы данных. Если это будет проблемой в зависимости от ситуации, лучшим выбором будет сервер централизованного доступа к данным со встроенными запросами.
Supun Wijerathne
источник
9

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

  • Получите наборы результатов базы данных из некоторой бизнес-логики данных.
  • Выполните несколько операций с базой данных за один вызов.
  • Используется для переноса данных из одной таблицы в другую.
  • Может быть вызван для других языков программирования, таких как Java.
MAA
источник
7

Хранимая процедура - это не что иное, как группа операторов SQL, скомпилированных в единый план выполнения.

  1. Создать один раз и назвать его n раз
  2. Это уменьшает сетевой трафик

Пример: создание хранимой процедуры

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE GetEmployee
      @EmployeeID int = 0
AS
BEGIN
      SET NOCOUNT ON;

      SELECT FirstName, LastName, BirthDate, City, Country
      FROM Employees 
      WHERE EmployeeID = @EmployeeID
END
GO

Изменить или изменить хранимую процедуру:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE GetEmployee
      @EmployeeID int = 0
AS
BEGIN
    SET NOCOUNT ON;

    SELECT FirstName, LastName, BirthDate, City, Country
    FROM Employees 
    WHERE EmployeeID = @EmployeeID
END
GO

Удалите или удалите хранимую процедуру:

DROP PROCEDURE GetEmployee
user5723819
источник
6

Хранимая процедура используется для извлечения данных, изменения данных и удаления данных в таблице базы данных. Вам не нужно писать целую команду SQL каждый раз, когда вы хотите вставить, обновить или удалить данные в базе данных SQL.

venkat
источник
4
  • Хранимая процедура - это предварительно скомпилированный набор из одного или нескольких операторов SQL, которые выполняют определенную задачу.

  • Хранимая процедура должна выполняться отдельно, используя EXEC

  • Хранимая процедура может возвращать несколько параметров

  • Хранимая процедура может быть использована для реализации транзакции

Kedarnath MS
источник
4

«Что такое хранимая процедура» уже дан ответ в других постах здесь. То, что я опубликую, является одним из менее известных способов использования хранимых процедур. Это grouping stored proceduresили numbering stored procedures.

Синтаксическая ссылка

введите описание изображения здесь

; numberсогласно этому

Необязательное целое число, которое используется для группировки процедур с одинаковым именем. Эти сгруппированные процедуры можно отбросить с помощью одного оператора DROP PROCEDURE.

пример

CREATE Procedure FirstTest 
(
    @InputA INT
)
AS 
BEGIN
    SELECT 'A' + CONVERT(VARCHAR(10),@InputA)
END
GO

CREATE Procedure FirstTest;2
(
    @InputA INT,
    @InputB INT
)
AS 
BEGIN
    SELECT 'A' + CONVERT(VARCHAR(10),@InputA)+ CONVERT(VARCHAR(10),@InputB)
END
GO

использование

exec FirstTest 10
exec FirstTest;2 20,30

результат

введите описание изображения здесь

Еще одна попытка

CREATE Procedure SecondTest;2
(
     @InputA INT,
    @InputB INT
)
AS 
BEGIN
    SELECT 'A' + CONVERT(VARCHAR(10),@InputA)+ CONVERT(VARCHAR(10),@InputB)
END
GO

результат

Сообщение 2730, уровень 11, состояние 1, процедура SecondTest, строка 1 [Batch Start Line 3] Невозможно создать процедуру «SecondTest» с номером группы 2, поскольку процедура с тем же именем и номером группы 1 в настоящее время не существует в база данных. Должен выполнить CREATE PROCEDURE 'SecondTest'; сначала 1.

Рекомендации :

  1. СОЗДАТЬ ПРОЦЕДУРУ с синтаксисом для числа
  2. Пронумерованные хранимые процедуры в SQL Server - techie-friendly.blogspot.com
  3. Группировка хранимых процедур - sqlmag

ВНИМАНИЕ

  1. После того, как вы сгруппируете процедуры, вы не сможете удалить их по отдельности.
  2. Эта функция может быть удалена в будущей версии Microsoft SQL Server.
Lijo
источник
0

Хранимая процедура - это именованный набор операторов SQL и процедурной логики, т. Е. Скомпилированный, проверенный и сохраненный в базе данных сервера. Хранимая процедура обычно обрабатывается как другие объекты базы данных и управляется с помощью механизма безопасности сервера.

Nirmala Hansdak
источник
0

В СУБД хранимая процедура - это набор операторов SQL с присвоенным именем, который хранится в базе данных в скомпилированной форме, чтобы ее могли использовать несколько программ.

Использование хранимой процедуры может быть полезным в

  1. Предоставление контролируемого доступа к данным (конечные пользователи могут только вводить или изменять данные, но не могут писать процедуры)

  2. Обеспечение целостности данных (данные будут вводиться согласованным образом) и

  3. Повышает производительность (операторы хранимой процедуры должны быть написаны только один раз)

Наина
источник
0

для простого,

Хранимая процедура - это хранимые программы , программа / функция, сохраненная в базе данных.

Каждая хранимая программа содержит тело, которое состоит из оператора SQL. Этот оператор может быть составным оператором, состоящим из нескольких операторов, разделенных точками с запятой (;).

CREATE PROCEDURE dorepeat(p1 INT)
BEGIN
  SET @x = 0;
  REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;
END;
AZinkey
источник
0

Хранимые процедуры в SQL Server могут принимать входные параметры и возвращать несколько значений выходных параметров; в SQL Server программные операторы хранимых процедур выполняют операции в базе данных и возвращают значение состояния вызывающей процедуре или пакету.

Преимущества использования хранимых процедур в SQL Server

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

Вот пример хранимой процедуры, которая принимает параметр, выполняет запрос и возвращает результат. В частности, хранимая процедура принимает BusinessEntityID в качестве параметра и использует его для сопоставления первичного ключа таблицы HumanResources.Employee для возврата запрошенного сотрудника.

> create procedure HumanResources.uspFindEmployee    `*<<<---Store procedure name`*
@businessEntityID                                     `<<<----parameter`
as
begin
SET NOCOUNT ON;
Select businessEntityId,              <<<----select statement to return one employee row
NationalIdNumber,
LoginID,
JobTitle,
HireData,
From HumanResources.Employee
where businessEntityId =@businessEntityId     <<<---parameter used as criteria
end

Я узнал об этом от essential.com ... это очень полезно.

Джерольд Джоэл
источник
0

Хранимая процедура поможет вам создать код на сервере. Вы можете передать параметры и найти вывод.

create procedure_name (para1 int,para2 decimal)
as
select * from TableName
Biddut
источник
0

В хранимых процедурах операторы записываются только один раз и сокращают сетевой трафик между клиентами и серверами. Мы также можем избежать Sql Injection Attacks.

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