什么是存储过程?

“存储过程”是什么?它们是如何工作的?

存储过程的组成是什么(每个必须必须是存储过程)?

576659 次浏览

一般来说,存储过程是一个“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注入攻击。

存储过程是可以以多种方式执行的一批SQL语句。大多数主流DBMs都支持存储过程;然而,并非所有国家都这样做。您需要查看特定的DBMS帮助文档以了解细节。因为我最熟悉的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

存储过程的一个好处是,您可以将数据访问逻辑集中到一个地方,这样DBA就可以很容易地进行优化。存储过程还有安全方面的好处,可以将执行权限授予存储过程,但用户不需要对底层表具有读/写权限。这是反对SQL注入的良好的第一步。

存储过程也有缺点,基本上是与基本CRUD操作相关的维护。假设对于每个表,您有一个插入、更新、删除和至少一个基于主键的选择,这意味着每个表将有4个过程。现在有一个400个表的数据库,其中有1600个过程!这还是在你没有副本的前提下你可能会有。

这就是使用ORM或其他方法自动生成基本CRUD操作的优点所在。

存储过程是一组预编译的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)

然后,我将值插入到Employee表中

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)

存储过程主要用于在数据库上执行某些任务。例如

  • 从数据上的一些业务逻辑获取数据库结果集。
  • 在一次调用中执行多个数据库操作。
  • 用于将数据从一个表迁移到另一个表。
  • 可用于其他编程语言,如Java。

存储过程用于检索数据、修改数据和删除数据库表中的数据。你不需要每次在SQL数据库中插入、更新或删除数据时都写一个完整的SQL命令。

存储过程是SQL语句和过程逻辑的命名集合,即编译、验证并存储在服务器数据库中。存储过程通常被视为其他数据库对象,并通过服务器安全机制进行控制。

存储过程是一组已创建并存储在数据库中的SQL语句。存储过程将接受输入参数,以便多个使用不同输入数据的客户端可以通过网络使用单个过程。存储过程可以减少网络流量并提高性能。如果我们修改一个存储过程,所有的客户端都将得到更新后的存储过程。

创建存储过程的示例

CREATE PROCEDURE test_display
AS
SELECT FirstName, LastName
FROM tb_test;


EXEC test_display;

使用存储过程的优点

  • 存储过程允许模块化编程。

    您可以只创建一次过程,将其存储在数据库中,并在程序中调用它任意次数

  • 存储过程允许更快的执行。

    如果操作需要大量重复执行的SQL代码,则存储过程可以更快。它们在第一次执行时被解析和优化,存储过程的编译版本保留在内存缓存中以供以后使用。这意味着存储过程不需要在每次使用时进行修复和重新优化,从而大大加快了执行时间

  • 存储过程可以减少网络流量。

    一个需要数百行Transact-SQL代码的操作可以通过在一个过程中执行该代码的单个语句来执行,而不是通过网络发送数百行代码

  • 存储过程为您的数据提供了更好的安全性

    即使用户没有直接执行存储过程语句的权限,也可以授予他们执行存储过程的权限。

    在SQL Server中,我们有不同类型的存储过程:

    • 系统存储过程
    • 用户定义存储过程
    • 扩展存储过程
    • 李< / ul > < / >
    • 系统-stored过程存储在主数据库中,并且以sp_前缀开始。这些过程可用于执行各种任务,以支持SQL Server函数用于系统表中的外部应用程序调用

      示例:sp_helptext [StoredProcedure_Name]

      .使用实例
    • user -defined存储过程通常存储在用户数据库中,通常用于完成用户数据库中的任务。在编码这些过程时,不要使用sp_前缀,因为如果我们先使用sp_前缀,它将检查主数据库,然后进入用户定义的数据库。

    • 扩展存储过程是调用DLL文件中的函数的过程。现在,扩展存储过程已被弃用,原因是最好避免使用扩展存储过程。

存储过程不过是编译成单个执行计划的一组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

想想这样的情况,

  • 你有一个数据数据库。
  • 有许多不同的应用程序需要访问这个中央数据库,将来还需要一些新的应用程序。
  • 如果要在每个应用程序的代码中分别插入内联数据库查询来访问中央数据库,那么可能必须在不同应用程序的代码中重复相同的查询。
  • 在这种情况下,您可以使用存储过程。使用存储过程,您可以编写一些常见的查询(过程)并将它们存储到中央数据库中。
  • 现在,工作的重复将不再像以前那样发生,数据访问和维护将集中完成。

注意:

  • 在上述情况下,您可能想知道“为什么我们不能引入一个中央数据访问服务器来与所有应用程序交互?”是的。这将是一个可能的替代方案。但是,
  • 与这种方法相比,sp的主要优势是,与使用内联查询的数据访问代码不同,sp是预编译的语句,因此执行速度更快。通信成本(通过网络)将降到最低。
  • 相反,sp会给数据库服务器增加更多的负载。如果根据情况需要考虑这一点,那么具有内联查询的集中式数据访问服务器将是更好的选择。
  • 存储过程是一个预编译的SQL语句集,它执行一些特定的任务。

  • 存储过程应该使用EXEC单独执行

  • 存储过程可以返回多个参数

  • 存储过程可用于实现事务

在DBMS中,存储过程是一组具有指定名称的SQL语句,这些SQL语句以编译后的形式存储在数据库中,这样就可以由许多程序共享。

存储过程的使用在

  1. 提供对数据的受控访问(最终用户只能输入或更改数据,但不能编写过程)

  2. 确保数据完整性(数据将以一致的方式输入)和

  3. 提高工作效率(存储过程的语句只需编写一次)

“什么是存储过程”已经在这里的其他帖子中回答过了。我将要发布的是一种不太为人所知的使用存储过程的方法。它是grouping stored proceduresnumbering stored procedures

语法参考

enter image description here

; 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

结果

enter image description here

另一个尝试

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

结果

Msg 2730, Level 11, State 1, Procedure SecondTest, Line 1 [Batch Start Line 3] 无法创建组号为2的过程“SecondTest”,因为数据库中当前不存在同名且组号为1的过程。 必须先执行CREATE PROCEDURE 'SecondTest';

参考文献:

  1. CREATE PROCEDURE with number语法
  2. 编号存储过程in SQL Server - techie-friend.blogspot.com
  3. 分组存储过程- sqlmag . rref ="http://sqlmag.com/database-administration/all-about-stored-procedures" rel="nofollow noreferrer">

谨慎

  1. 对过程进行分组后,就不能单独删除它们了。
  2. 此功能可能会在Microsoft SQL Server的未来版本中删除。

对于简单的,

存储过程存储程序,存储在数据库中的程序/函数。

每个存储的程序都包含一个由SQL语句组成的主体。该语句可以是由几个用分号(;)分隔的语句组成的复合语句。

CREATE PROCEDURE dorepeat(p1 INT)
BEGIN
SET @x = 0;
REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;
END;

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上学到的,非常有用。

存储过程将帮助您在服务器中编写代码。您可以传递参数并查找输出。

create procedure_name (para1 int,para2 decimal)
as
select * from TableName

在存储过程中,语句只写入一次,减少了客户端和服务器之间的网络流量。 我们还可以避免Sql注入攻击

  • 如果你在你的应用程序中使用第三方程序 处理支付时,这里的数据库应该只暴露 它所需要的信息和该第三方的活动 通过授权,我们可以实现数据的保密性设置
  • 表的更新应该只对它所针对的表进行 但它不应该更新任何其他的表,这是我们可以实现的
  • .使用事务处理和错误处理的数据完整性
  • 如果您想返回一个或多个具有数据类型的项,则为 最好使用输出参数 在存储过程中,我们使用输出形参来表示 需要返回。如果您想只返回一项 整数数据类型最好使用返回值。实际上 返回值只是通知存储的成功或失败 李过程。< / >

序言:SQL92标准创建于1992年,并由Firebase DB推广。该标准引入了“存储过程”。

< p > * * 透传查询:一个字符串(通常通过编程连接),计算为语法正确的SQL语句,通常在服务器层生成(在PHP、Python、PERL等语言中)。然后将这些语句传递到数据库。 * * < / p > < p > * * 触发器:设计用于响应数据库事件(通常是DML事件)而触发的一段代码,通常用于强制数据完整性。 * * < / p >

解释什么是存储过程的最好方法是解释执行DB逻辑的传统方式(即不使用存储过程)。

创建系统的传统方式是使用“直通查询”,并且可能在DB中有触发器。 几乎所有不使用存储过程的人都会使用“直通查询”

随着存储过程的现代约定,触发器和“透传查询”一起成为传统。

存储过程的优点是:

  1. 可以作为存储过程的物理文本缓存 李从不改变。< / > 他们已经内置了对抗恶意SQL的机制 李注入。< / >
  2. 只有参数需要检查恶意SQL
  3. .注入节省大量处理器开销
  4. 最新的数据库
  5. 他们增加了 层之间的抽象程度
  6. 它们发生在同一个地方 进程作为数据库,允许更大的优化和 李吞吐量。< / >
  7. 后端整个工作流程都可以测试 没有客户端代码。(例如,在 Transact SQL或MySQL中的CALL命令).
  8. 它们可以用来 增强安全性,因为可以利用它们来禁止 数据库的访问方式与 系统是为工作而设计的。这是通过数据库用户完成的 许可机制。例如,您可以只给用户特权 执行存储过程,而不是选择,更新等 李特权。< / >
  9. 不需要与触发器关联的DML层。** 使用如此多的触发器,打开一个DML层,非常 处理器密集**

总之,在创建一个新的SQL数据库系统时,没有理由使用直通查询。

值得一提的是,在已经使用触发器或直通查询的遗留系统中使用存储过程是完全安全的;这意味着从遗留过程迁移到存储过程是非常容易的,而且这样的迁移不会使系统长时间停机。