СРС / 3 - Хран процедуры
.docx
Создание хранимых процедур для базы данных Book
Следующим шагом создадим хранимые процедуры для базы данных Book. Для создания хранимых процедур используем соответствующие операторы T-SQL.
Минимально необходимыми для базы данных Book являются хранимые процедуры, обеспечивающие выборку, вставку, модификацию и удаление данных для всех таблиц базы данных. Использование этих хранимых процедур позволяет:
ограничить возможности обычного пользователя в плане нанесения ущерба базе данных;
обеспечить построение эффективного кода приложения, работающего с базой данных.
1. Хранимые процедуры, необходимые для выборки, вставки, модификации и удаления данных для таблицы Catalogs.
Выборка данных (процедура Catalog_Select).
USE Book;
GO
IF OBJECT_ID( 'Catalog_Select', 'P' ) IS NOT NULL
DROP PROCEDURE Catalog_Select;
GO
CREATE PROCEDURE Catalog_Select ( @cat_ID int = NULL )
AS
BEGIN
SET NOCOUNT ON
SELECT
Catalogs.cat_ID,
Catalogs.cat_name
FROM Catalogs
WHERE
@cat_ID IS NULL OR Catalogs.cat_ID = @cat_ID
END
GO
Вызов процедуры Catalog_Select с указанием значения параметра @cat_ID позволяет получить данные о конкретном каталоге. Вызов этой же процедуры без указания значения параметра @cat_ID выводит все записи таблицы Catalogs.
Вставка данных (процедура Catalog_Insert).
USE Book;
GO
IF OBJECT_ID ( 'Catalog_Insert', 'P' ) IS NOT NULL
DROP PROCEDURE Catalog_Insert;
GO
CREATE PROCEDURE Catalog_Insert (
@cat_ID INT,
@cat_name varchar(20) )
AS
BEGIN
SET NOCOUNT ON
INSERT INTO Catalogs ( cat_ID, cat_name )
VALUES ( @cat_ID, @cat_name );
RETURN @@ERROR
END
GO
Вызов процедуры Catalog_Insert с указанием значений параметров @cat_ID, @cat_name позволяет ввести новую строку в таблицу Catalogs. Значение глобальной переменной @@ERROR характеризует правильность выполнения запроса.
Модификация данных (процедура Catalog_Update).
USE Book;
GO
IF OBJECT_ID ( 'Catalog_Update', 'P' ) IS NOT NULL
DROP PROCEDURE Catalog_Update;
GO
CREATE PROCEDURE Catalog_Update (
@cat_ID int,
@cat_name varchar(50))
AS
BEGIN
SET NOCOUNT ON;
UPDATE Catalogs
SET
cat_ID = @cat_ID,
cat_name = @cat_name
WHERE cat_ID = @cat_ID;
RETURN @@ERROR
END
GO
Вызов процедуры Catalog_Update с указанием значений параметров @cat_ID, @cat_name позволяет изменить название каталога в заданной строке таблицы Catalogs. Значение глобальной переменной @@ERROR характеризует правильность выполнения запроса.
Удаление данных (процедура Catalog_Delete).
USE Book;
GO
IF OBJECT_ID ( 'Catalog_Delete', 'P' ) IS NOT NULL
DROP PROCEDURE Catalog_Delete;
GO
CREATE PROCEDURE Catalog_Delete ( @cat_ID int = NULL)
AS
BEGIN
SET NOCOUNT ON;
DELETE FROM Catalogs
WHERE cat_ID = @cat_ID;
RETURN @@ERROR
END
GO
Вызов процедуры Catalog_Delete с указанием значения параметра @cat_ID позволяет удалить заданную строку в таблице Catalogs. Выведенное после вызова значение глобальной переменной @@ERROR позволяет убедиться в правильности выполнения запроса.
2. Хранимые процедуры, необходимые для выборки, вставки, модификации и удаления данных для таблицы Books.
Выборка данных (процедура Book_Select).
USE Book;
GO
IF OBJECT_ID( 'Book_Select', 'P' ) IS NOT NULL
DROP PROCEDURE Book_Select;
GO
CREATE PROCEDURE Book_Select (
@book_ID int = NULL,
@cat_ID int = NULL )
AS
BEGIN
SET NOCOUNT ON;
SELECT
Books.book_ID, Books.b_name, Books.b_author, Books.b_year,
Books.b_price, Books.b_count, Catalogs.cat_name
FROM Books LEFT OUTER JOIN Catalogs
ON Catalogs.cat_ID = Books.b_cat_ID
WHERE
( @book_ID IS NULL OR Books.book_ID = @book_ID ) AND
( @cat_ID IS NULL OR Books.b_cat_ID = @cat_ID )
END
GO
Вызов процедуры Book_Select с использованием значений параметров @book_ID и @cat_ID по умолчанию (NULL) позволяет получить список всех книг, имеющихся в интернет-магазине с распределением по каталогам.
Вызов процедуры Book_Select с указанием значения @book_ID = 3 (значение @cat_ID по умолчанию – NULL) позволяет получить данные о книге с кодом 3:
USE Book;
GO
EXEC Book_Select 3, DEFAULT;
GO
Соответственно, вызов процедуры Book_Select с указанием @cat_ID = 5 (значение @book_ID по умолчанию – NULL) позволяет получить данные обо всех книгах каталога с кодом 5:
USE Book;
GO
EXEC Book_Select DEFAULT, 5;
GO
Вставка данных (процедура Book_Insert).
USE Book;
GO
IF OBJECT_ID ( 'Book_Insert', 'P' ) IS NOT NULL
DROP PROCEDURE Book_Insert;
GO
CREATE PROCEDURE Book_Insert (
@book_ID INT,
@b_name varchar(100),
@b_author varchar(100),
@b_year INT,
@b_price MONEY = 0.00,
@b_count INT = 0,
@b_cat_ID INT )
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO Books (
book_ID, b_name, b_author, b_year, b_price, b_count, b_cat_ID )
VALUES (
@book_ID, @b_name, @b_author, @b_year,
@b_price, @b_count, @b_cat_ID );
RETURN @@ERROR
END
GO
Вызов процедуры Book_Insert с указанием значений параметров позволяет ввести новую строку в таблицу Books. Значение глобальной переменной @@ERROR характеризует правильность выполнения запроса.
Модификация данных (процедура Book_Update).
USE Book;
GO
IF OBJECT_ID ( 'Book_Update', 'P' ) IS NOT NULL
DROP PROCEDURE Book_Update;
GO
CREATE PROCEDURE Book_Update (
@book_ID INT,
@b_name varchar(100),
@b_author varchar(100),
@b_year INT,
@b_price MONEY = 0.00,
@b_count INT = 0,
@b_cat_ID INT )
AS
BEGIN
SET NOCOUNT ON
UPDATE Books
SET
book_ID = @book_ID, b_name = @b_name, b_author = @b_author,
b_year = @b_year, b_price = @b_price, b_count = @b_count,
b_cat_ID = @b_cat_ID
WHERE book_ID = @book_ID
RETURN @@ERROR
END
GO
Вызов процедуры Book_Update с указанием значений параметров позволяет изменить данные о книге в заданной строке таблицы Books. Значение глобальной переменной @@ERROR характеризует правильность выполнения запроса.
Удаление данных (процедура Book_Delete).
USE Book;
GO
IF OBJECT_ID ( 'Book_Delete', 'P' ) IS NOT NULL
DROP PROCEDURE Book_Delete;
GO
CREATE PROCEDURE Book_Delete ( @book_ID int = NULL )
AS
BEGIN
SET NOCOUNT ON;
DELETE FROM Books
WHERE book_ID = @book_ID;
RETURN @@ERROR
END
GO
Вызов процедуры Book_Delete с указанием значения параметра @book_ID позволяет удалить заданную строку в таблице Books. Выведенное после вызова значение глобальной переменной @@ERROR позволяет убедиться в правильности выполнения запроса.
3. Хранимые процедуры, необходимые для выборки, вставки, модификации и удаления данных для таблицы Users.
Выборка данных (процедура User_Select).
USE Book;
GO
IF OBJECT_ID( 'User_Select', 'P' ) IS NOT NULL
DROP PROCEDURE User_Select;
GO
CREATE PROCEDURE User_Select ( @user_ID int = NULL )
AS
BEGIN
SET NOCOUNT ON;
SELECT
Users.user_ID, Users.u_name, Users.u_patronymic, Users.u_surname,
Users.u_phone, Users.u_email, Users.u_status
FROM Users
WHERE
( @user_ID IS NULL OR Users.user_ID = @user_ID )
END
GO
Вызов процедуры User_Select с указанием значения параметра @user_ID позволяет получить данные о конкретном клиенте. Вызов этой же процедуры без указания значения параметра @user_ID выводит все записи таблицы Users.
Вставка данных (процедура User_Insert).
USE Book;
GO
IF OBJECT_ID ( 'User_Insert', 'P' ) IS NOT NULL
DROP PROCEDURE User_Insert;
GO
CREATE PROCEDURE User_Insert (
@user_ID INT,
@u_name varchar(20),
@u_patronymic varchar(20),
@u_surname varchar(20),
@u_phone varchar(15),
@u_email varchar(20),
@u_status varchar(10) )
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO Users (
user_ID, u_name, u_patronymic, u_surname,
u_phone, u_email, u_status )
VALUES (
@user_ID , @u_name , @u_patronymic , @u_surname ,
@u_phone , @u_email , @u_status );
RETURN @@ERROR
END
GO
Вызов процедуры User_Insert с указанием значений параметров позволяет ввести новую строку в таблицу Users. Значение глобальной переменной @@ERROR характеризует правильность выполнения запроса.
Модификация данных (процедура User_Update).
USE Book;
GO
IF OBJECT_ID ( 'User_Update', 'P' ) IS NOT NULL
DROP PROCEDURE User_Update;
GO
CREATE PROCEDURE User_Update (
@user_ID INT,
@u_name varchar(20),
@u_patronymic varchar(20),
@u_surname varchar(20),
@u_phone varchar(15),
@u_email varchar(20),
@u_status varchar(10) )
AS
BEGIN
SET NOCOUNT ON;
UPDATE Users
SET
user_ID = @user_ID, u_name = @u_name ,
u_patronymic = @u_patronymic, u_surname = @u_surname,
u_phone = @u_phone, u_email = @u_email,
u_status = @u_status
WHERE user_ID = @user_ID;
RETURN @@ERROR
END
GO
Вызов процедуры User_Update с указанием значений параметров позволяет изменить данные о клиенте в заданной строке таблицы Users. Значение глобальной переменной @@ERROR характеризует правильность выполнения запроса.
Удаление данных (процедура User_Delete).
USE Book;
GO
IF OBJECT_ID ( 'User_Delete', 'P' ) IS NOT NULL
DROP PROCEDURE User_Delete;
GO
CREATE PROCEDURE User_Delete ( @user_ID int = NULL )
AS
BEGIN
SET NOCOUNT ON;
DELETE FROM Users
WHERE user_ID = @user_ID;
RETURN @@ERROR
END
GO
Вызов процедуры User_Delete с указанием значения параметра @user_ID позволяет удалить заданную строку в таблице Users. Значение глобальной переменной @@ERROR характеризует правильность выполнения запроса.
4. Хранимые процедуры, необходимые для выборки, вставки, модификации и удаления данных для таблицы Orders.
Выборка данных (процедура Order_Select).
USE Book;
GO
IF OBJECT_ID( 'Order_Select', 'P' ) IS NOT NULL
DROP PROCEDURE Order_Select;
GO
CREATE PROCEDURE Order_Select (
@order_ID int = NULL,
@user_ID int = NULL,
@book_ID int = NULL )
AS
BEGIN
SET NOCOUNT ON;
SELECT
Orders.order_ID,
Orders.o_user_ID,
Users.u_name + ' ' + Users.u_surname AS 'user_full_name',
Orders.o_book_ID,
Books.b_name,
Orders.o_time,
Orders.o_number
FROM Orders
LEFT OUTER JOIN Users ON Users.user_ID = Orders.o_user_ID
LEFT OUTER JOIN Books ON Books.book_ID = Orders.o_book_ID
WHERE
( @order_ID IS NULL OR Orders.order_ID = @order_ID ) AND
( @user_ID IS NULL OR Orders.o_user_ID = @user_ID ) AND
( @book_ID IS NULL OR Orders.o_book_ID = @book_ID )
END
GO
Процедура Order_Select использует не только базовую таблицу Orders, но и связанные таблицы Users и Books. Три параметра процедуры – @order_ID, @user_ID и @book_ID обеспечивают широкие возможности по выборке данных.
Вызов процедуры Order_Select с использованием значений всех трех параметров по умолчанию (NULL) позволяет получить список всех заказов интернет-магазина.
Вызов процедуры Order_Select с указанием @order_ID = 1 (значения остальных параметров по умолчанию – NULL) позволяет получить информацию о заказе с кодом 1:
USE Book;
GO
EXEC Order_Select 1, DEFAULT, DEFAULT;
GO
Вызов процедуры Order_Select с указанием @user_ID = 3 (значения остальных параметров по умолчанию – NULL) позволяет получить список всех заказов пользователя с кодом 3:
USE Book;
GO
EXEC Order_Select DEFAULT, 3, DEFAULT;
GO
Вызов процедуры Order_Select с указанием @book_ID = 20 (значения остальных параметров по умолчанию – NULL) позволяет получить список всех заказов, содержащих книгу с кодом 20:
USE Book;
GO
EXEC Order_Select DEFAULT, DEFAULT, 20;
GO
Вызов процедуры Order_Select с указанием @user_ID = 3 и @book_ID = 20 (значение параметра @order_ID по умолчанию – NULL) позволяет получить список заказов пользователя с кодом 3, содержащих книгу с кодом 20:
USE Book;
GO
EXEC Order_Select DEFAULT, 3, 20;
GO
Вставка данных (процедура Order_Insert).
USE Book;
GO
IF OBJECT_ID( 'Order_Insert', 'P' ) IS NOT NULL
DROP PROCEDURE Order_Insert;
GO
CREATE PROCEDURE Order_Insert (
@order_ID int,
@user_ID int,
@book_ID int,
@o_time dateTIME,
@o_number INT )
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO Orders (
order_ID, o_user_ID, o_book_ID,
o_time, o_number )
VALUES (
@order_ID , @user_ID , @book_ID ,
@o_time, @o_number );
RETURN @@ERROR
END
GO
Вызов процедуры Order_Insert с указанием значений всех параметров позволяет ввести новую строку в таблицу Orders.
Обновление данных (процедура Order_Update).
USE Book;
GO
IF OBJECT_ID( 'Order_Update', 'P' ) IS NOT NULL
DROP PROCEDURE Order_Update;
GO
CREATE PROCEDURE Order_Update (
@order_ID int,
@user_ID int,
@book_ID int,
@o_time dateTIME,
@o_number INT )
AS
BEGIN
SET NOCOUNT ON;
UPDATE Orders
SET
order_ID = @order_ID , o_user_ID = @user_ID ,
o_book_ID = @book_ID , o_time = @o_time ,
o_number = @o_number
WHERE order_ID = @order_ID;
RETURN @@ERROR
END
GO
Вызов процедуры Order_Update с указанием значений всех параметров изменяет строку в таблицу Orders.
Удаление данных (процедура Order_Delete).
USE Book;
GO
IF OBJECT_ID ( 'Order_Delete', 'P' ) IS NOT NULL
DROP PROCEDURE Order_Delete;
GO
CREATE PROCEDURE Order_Delete ( @order_ID int = NULL )
AS
BEGIN
SET NOCOUNT ON;
DELETE FROM Orders
WHERE order_ID = @order_ID;
RETURN @@ERROR
END
GO
Вызов процедуры Order_Delete с указанием значения параметра @order_ID позволяет удалить конкретную строку в таблице Orders. Выведенное после вызова значение глобальной переменной @@ERROR позволяет убедиться в правильности выполнения запроса.