10、视图+存储过程

Posted by CodingWithAlice on July 11, 2022

10、视图+存储过程

阅读书籍《SQL必知必会(第4版)》笔记

1、视图

视图:是虚拟的表,它包含的不是数据,而是根据需要的 检索数据查询

作用:创建视图、隐藏复杂 sql 查询语句、方便复用

CREATE VIEW ProductCustomers AS
SELECT cust_name, cust_contact, prod_id
FROM Customers, Orders, OrderItems
WHERE Customers.cust_id = Orders.cust_id
	AND OrderItems.order_num = Orders.order_num;
-- 创建了这个视图后,其他查询可以在这个视图下查询
SELECT cast_name, just_contact
FROM ProductCustomers
WHERE prod_id = 'RGAN01';

2、存储过程

执行时的基本形式:

  • 参数可选,具有不提供参数时的默认值
  • 不按次序给出参数,以”参数=值“的方式给出参数值
  • 输出参数,允许存储过程在正执行的应用程序中更新所用的参数
  • 用 SELECT 语句检索数据
  • 返回代码,允许存储过程返回一个值到正在执行的应用程序
# 案例1:对具有邮件地址的客户进行计数
-- @开头的变量代表局部变量
CREATE PRODUCER MailingListCount AS
DECLARE @cnt INTEGER
SELECT @cnt = COUNT(*)
FROM Customers
WHERE NOT cust_email IS NULL;
RETURN @cnt;
-- 调用方式
DECLARE @ReturnValue INT
EXECUTE @ReturnValue = MailingListCount;
SELECT @ReturnValue;
# 案例2:在 Orders 表中插入一个新订单 -> 入参只有一个用户 id
CREATE PRODUCER NewOrder @cust_id CHAR(10)  AS # 参数为用户ID
DECLARE @order_num INTEGER # 先声明一个局部变量,来存储订单号
SELECT @order_num = MAX(order_num) # 检索当前最大订单号
FROM Orders
SELECT @order_num = @order_num + 1 # 订单号 + 1
INSERT INTO Orders(order_num, order_rate, cust_id) # 通过 INSERT 将新订单插入
VALUES(@order_num, GETDATE(), @cust_id)
RETURN @order_num; # 最后返回订单号