Процедуры

Содержание

Слайд 2

Процедуры

Базы данных: учебный курс

Синтаксис для создания процедур может различаться в различных БД. Вот

Процедуры Базы данных: учебный курс Синтаксис для создания процедур может различаться в
типичный пример запроса на создание процедуры в MS SQL Server:

CREATE PROCEDURE CreateWeek
@first int = 0
AS
BEGIN
DROP TABLE Weekdays;
CREATE TABLE Weekdays(DayNumber INTEGER, DayName VARCHAR(20),
PRIMARY KEY(DayNumber));
INSERT INTO WeekDays(DayNumber, DayName) VALUES(@first, 'Monday');
INSERT INTO WeekDays(DayNumber, DayName) VALUES(@first+1, 'Tuesday');
INSERT INTO WeekDays(DayNumber, DayName) VALUES(@first+2, 'Wednesday');
INSERT INTO WeekDays(DayNumber, DayName) VALUES(@first+3, 'Thursday');
INSERT INTO WeekDays(DayNumber, DayName) VALUES(@first+4, 'Friday');
INSERT INTO WeekDays(DayNumber, DayName) VALUES(@first+5, 'Saturday');
INSERT INTO WeekDays(DayNumber, DayName) VALUES(@first+6, 'Sunday');
END

Слайд 3

JDBC – Создание и вызов процедур

Базы данных: учебный курс

// Подключаемся к драйверу

JDBC – Создание и вызов процедур Базы данных: учебный курс // Подключаемся
базы данных Connection conn = null;
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
conn = DriverManager.getConnection( "jdbc:sqlserver://127.0.0.1\\SQLAKOUB;databaseName=academy;" + "user=sa;password=*****"); // Подготавливаем вызов хранимой процедуры
CallableStatement cst = conn.prepareCall("Exec CreateWeek 1");
// Осуществляем вызов
cst.execute();

Слайд 4

Процедуры с выходными параметрами

Базы данных: учебный курс

Изменим наш пример таким образом, чтобы

Процедуры с выходными параметрами Базы данных: учебный курс Изменим наш пример таким
процедура формировала некоторое значение в качестве результата:

ALTER PROCEDURE CreateWeek
@first int = 0, @maxnum int OUTPUT
AS
BEGIN
DROP TABLE Weekdays;
CREATE TABLE Weekdays(DayNumber INTEGER, DayName VARCHAR(20),
PRIMARY KEY(DayNumber));
INSERT INTO WeekDays(DayNumber, DayName) VALUES(@first, 'Monday');
INSERT INTO WeekDays(DayNumber, DayName) VALUES(@first+1, 'Tuesday');
INSERT INTO WeekDays(DayNumber, DayName) VALUES(@first+2, 'Wednesday');
INSERT INTO WeekDays(DayNumber, DayName) VALUES(@first+3, 'Thursday');
INSERT INTO WeekDays(DayNumber, DayName) VALUES(@first+4, 'Friday');
INSERT INTO WeekDays(DayNumber, DayName) VALUES(@first+5, 'Saturday');
INSERT INTO WeekDays(DayNumber, DayName) VALUES(@first+6, 'Sunday'); SET @maxnum = (SELECT Max(DayNumber) FROM Weekdays);
END

Слайд 5

JDBC – Работа с выходными параметрами

Базы данных: учебный курс

// Подготавливаем вызов хранимой

JDBC – Работа с выходными параметрами Базы данных: учебный курс // Подготавливаем
процедуры
CallableStatement cst = conn.prepareCall("Exec CreateWeek ?, ?"); // Подготавливаем параметры (входные и выходные) cst.setInt(1, 0); cst.registerOutParameter(2, Types.INTEGER);
// Осуществляем вызов
cst.execute(); // Доступ к значению выходного параметра: System.out.println(cst.getInt(2));

Слайд 6

JDBC – Работа с именованными параметрами

Базы данных: учебный курс

// Подготавливаем вызов хранимой

JDBC – Работа с именованными параметрами Базы данных: учебный курс // Подготавливаем
процедуры
CallableStatement cst = conn.prepareCall( "Exec CreateWeek @first=?, @maxnum=?"); // Подготавливаем параметры (входные и выходные) cst.setInt("first", 0); cst.registerOutParameter("maxnum", Types.INTEGER);
// Осуществляем вызов
cst.execute(); // Доступ к значению выходного параметра: System.out.println(cst.getInt("maxnum"));

Синтаксис вызова может отличаться в разных БД и даже с разными драйверами. Например, в других БД вызов мог бы выглядеть Call CreateWeek(?,?) {CreateWeek(?,?)} и т.д.

Слайд 7

Более сложные процедуры

Базы данных: учебный курс

CREATE FUNCTION dbo.WeekDay(@day INT) RETURNS VARCHAR(20) AS
BEGIN

Более сложные процедуры Базы данных: учебный курс CREATE FUNCTION dbo.WeekDay(@day INT) RETURNS
RETURN
CASE @day
WHEN 0 THEN 'Monday'
WHEN 1 THEN 'Tuesday'
WHEN 2 THEN 'Wednesday'
WHEN 3 THEN 'Thursday'
WHEN 4 THEN 'Friday'
WHEN 5 THEN 'Saturday'
WHEN 6 THEN 'Sunday'
END
END

В разных БД есть синтаксис для исполнения программ, подобный синтаксису обычных языков программирования. Например, в Transact-SQL:

Слайд 8

Более сложные процедуры

Базы данных: учебный курс

CREATE PROCEDURE CreateWeek
@first INT = 0
AS
BEGIN
DECLARE

Более сложные процедуры Базы данных: учебный курс CREATE PROCEDURE CreateWeek @first INT
@ndx INT, @ord INT;
SET @ndx = 0; SET @ord = (7 - @first) % 7;
DROP TABLE Weekdays;
CREATE TABLE Weekdays(DayOrder INT, DayNumber INT, DayName VARCHAR(20), PRIMARY KEY(DayNumber));
WHILE (@ndx < 7) BEGIN
INSERT INTO WeekDays(DayOrder, DayNumber, DayName) VALUES(@ndx, @ord, dbo.WeekDay(@ndx));
SET @ndx = @ndx + 1;
SET @ord = (@ord + 1) % 7;
END
END

Теперь наша процедура по созданию таблицы в Transact-SQL могла бы выглядеть так:

Слайд 9

Другие объекты в БД

Базы данных: учебный курс

Представления (VIEW): виртуальные таблицы

Новое представление создается

Другие объекты в БД Базы данных: учебный курс Представления (VIEW): виртуальные таблицы
с помощью предложения CREATE VIEW, например:

CREATE VIEW Weekend AS
SELECT * FROM Weekdays WHERE DayOrder >= 5

Теперь это представление можно использовать как обычную таблицу, например:

SELECT DayName FROM Weekend

И даже:

INSERT INTO Weekend (DayOrder, DayNumber, DayName) VALUES (7, 8, 'Googleday')

Обычно представления используют для создания запросов, используемых позже в качестве «подзапросов»:

CREATE VIEW MaxPercent AS
SELECT Uid, Max([Percent]) AS MaxPercent FROM pu GROUP BY Uid

SELECT Name, MaxPercent FROM Users INNER JOIN MaxPercent ON Users.Id = MaxPercent.Uid

Слайд 10

Другие объекты в БД

Базы данных: учебный курс

Функции, возвращающие таблицу

Представления не могут быть

Другие объекты в БД Базы данных: учебный курс Функции, возвращающие таблицу Представления
параметризованы. Однако, во многих БД (MS SQL Server) существует мощный механизм, позволяющий создавать параметризованные функции, возвращающие таблицу.
Сначала создадим «общую виртуальную таблицу процентов»

CREATE VIEW UsersPercent AS
SELECT Uid, Sum([Percent]) AS SumPercent FROM pu GROUP BY Uid

CREATE FUNCTION FreeUsers(@p INT) RETURNS TABLE
AS
RETURN SELECT Users.*, SumPercent FROM Users INNER JOIN UsersPerecent ON Users.Id = UsersPercent.Uid WHERE SumPercent < @p

SELECT fu.* FROM FreeUsers(80) AS fu

Имя файла: Процедуры.pptx
Количество просмотров: 89
Количество скачиваний: 0