存储过程和参数
区别于之前的用单独一条语句检索数据,现在把多条语句保存到一个叫存储过程的单独对象中。
使用存储过程的原因:
1. 把多条SQL语句保存到单独的过程中
2. 把参数和SQL语句结合使用(也可以不含参数)
一、创建存储过程
CREATE PROCEDURE ProcedureName,
AS
[OptionalParameterDeclarations]
BEGIN
SQLStatements
END
MySQL版本:
DELIMITER $$
CREATE PROCEDURE ProcedureName()
BEGIN
SQLStatements
END$$
DELIMITER ;
第一行的作用:把分隔符从逗号临时改为$$,所需的参数在圆括号中指定,最后必须有分号; 。关键字END后的$$符号,表示CREATE PROCEDURE命令结束。最后一行把分隔符改回分号。
简单示例:
创建一个存储过程,可以用来执行下面:
SELECT *
FROM Customers
CREATE PROCEDURE ProcedureOne
AS
BEGIN
SELECT *
FROM Customers
END
没有参数,AS后面直接是BEGIN和END(里面是SQL语句)
注意SQL的BEGIN和END之间的SQLStatements不需要以分号结尾,而
MySQL:
DELIMITER $$
CREATE PROCEDURE ProcedureOne()
BEGIN
SELECT *
FROM Customers;
END$$
DELIMITER ;
MySQL的BEGIN和END之间的SQLStatements需要以分号结尾,所以要使用DELIMITER暂时把分隔符改为$$以免还没定义完整过程就结束了命令。
创建存储过程不会执行任何东西,只是可以在以后执行它。
二、存储过程的参数
比如接受CustomerID这一参数:
SELECT *
FROM Customers
增加WHERE子句,选取特定客户的数据:
SELECT *
FROM Customers
WHERE CustomerID = ParameterValue
CREATE PROCEDURE CustomerProcedure
(@CustID INT)
AS
BEGIN
SELECT *
FROM Customers
WHERE CustomerID = @CustID
END
SQL使用@来表示变量。
MySQL版本:
DELIMITER $$
CREATE PROCEDURE CustomerProcedure
(CustID, INT)
BEGIN
SELECT *
FROM Customers
WHERE CustomerID = CustID;
END$$
DELIMITER ;
三、执行存储过程
SQL Server:EXEC ProcedureOne
即返回ProcedureOne里面包含的SELECT语句的结果。注意ProcedureOne不带参数。
EXEC CustomerProcedure
@CustID = 2
MySQL版本:
CALL ProcedureOne;
CALL CustomerProcedure(2);
四、修改和删除存储过程
ALTER关键字,语法和CREATE PROCEDURE一样。
比如修改只想看某个客户的前5行记录:
ALTER PROCEDURE CustomerProcedure
(@CustID, INT)
BEGIN
SELECT
TOP 5 *
FROM Customers
WHERE CustomerID = @CustID
END
删除
DROP PROCEDURE CustomerProcedure
此外,SQL还提供关键字CREATE FUNCTION、ALTER FUNCTION、DROP FUNCTION等创建、修改、删除自己定义的函数。
五、存储过程VS函数:
(1)存储过程可以有任意数目的输出函数:甚至可以没有。但是一个函数必须只有一个单一的返回值。
(2)通过调用程序来执行存储过程。不能在SELECT语句中直接引用存储过程,但可以在语句中引用函数。