在 SQL 中,参数化存储过程是一种可以接受输入参数的 存储过程。这些参数可用于自定义存储过程的行为,并根据提供的输入值执行操作。
例如,假设我们要获取 country 列中值为 USA 的记录。因此,我们将编写 SQL 语句,如下所示:
SELECT *
FROM Customers
WHERE country = 'USA';
同样,如果我们想获取 country 值为 UK 的记录,我们将编写 SQL 语句,如下所示:
SELECT *
FROM Customers
WHERE country = 'UK';
请注意,在上面的两个示例中,除了在 country 列中查找的值之外,其他所有内容都相同。
因此,我们不必重复编写相同的代码,而是可以创建一个存储过程,并使用不同的值来调用它。
创建参数化存储过程
我们使用 CREATE PROCEDURE
命令后跟 SQL 命令来创建参数化存储过程。我们通过使用 @
运算符或将参数包含在括号 ()
中来指定参数。例如,
SQL Server
CREATE PROCEDURE ctr_customers @ctr VARCHAR(50) AS
SELECT customer_id, first_name
FROM Customers
WHERE Country = @ctr;
PostgreSQL
CREATE PROCEDURE ctr_customers (ctr VARCHAR(50))
LANGUAGE SQL
AS $$
SELECT customer_id, first_name
FROM Customers
WHERE Country = ctr;
$$;
MySQL
DELIMITER //
CREATE PROCEDURE ctr_customers (ctr VARCHAR(50))
BEGIN
SELECT customer_id, first_name
FROM Customers
WHERE Country = ctr;
END //
DELIMITER ;
在这里,ctr 是我们在调用名为 ctr_customers
的存储过程时需要传递的参数。
执行参数化存储过程
每当我们想根据 country
列中的值获取记录时,都可以简单地调用上面创建的存储过程。例如,
SQL Server
-- call the stored procedure with 'USA' as parameter value
EXEC ctr_customers 'USA';
-- call the same stored procedure again with another parameter value 'UK'
EXEC ctr_customers 'UK';
PostgreSQL, MySQL
-- call the stored procedure with 'USA' as parameter value
CALL ctr_customers ('USA');
-- call the same stored procedure again with another parameter value 'UK'
CALL ctr_customers ('UK');
多个参数化存储过程
存储过程也可以接受多个参数。例如,
SQL Server
-- create stored procedure with cus_id and max_amount as parameters
CREATE PROCEDURE order_details @cus_id INT, @max_amount INT AS
SELECT Customers.customer_id, Customers.first_name, Orders.amount
FROM Customers
JOIN Orders
ON Customers.customer_id = Orders.customer_id
WHERE Customers.customer_id = @cus_id AND Orders.amount < @max_amount;
PostgreSQL
-- create stored procedure with cus_id and max_amount as parameters
CREATE PROCEDURE order_details (cus_id INT, max_amount INT)
LANGUAGE SQL
AS $$
SELECT Customers.customer_id, Customers.first_name, Orders.amount
FROM Customers
JOIN Orders
ON Customers.customer_id = Orders.customer_id
WHERE Customers.customer_id = cus_id AND Orders.amount < max_amount;
$$;
MySQL
-- create stored procedure with cus_id and max_amount as parameters
DELIMITER //
CREATE PROCEDURE order_details (cus_id INT, max_amount INT)
BEGIN
SELECT Customers.customer_id, Customers.first_name, Orders.amount
FROM Customers
JOIN Orders
ON Customers.customer_id = Orders.customer_id
WHERE Customers.customer_id = cus_id AND Orders.amount < max_amount;
END //
DELIMITER ;
现在,我们可以使用以下代码调用此函数:
SQL Server
EXEC order_details 4, 400;
PostgreSQL, MySQL
CALL order_details (4, 400);
在这里,我们将两个数字(4 和 400)作为参数值传递给 order_details
存储过程。
另请阅读