Содержание
- 2. Процедуры Базы данных: учебный курс Синтаксис для создания процедур может различаться в различных БД. Вот типичный
- 3. JDBC – Создание и вызов процедур Базы данных: учебный курс // Подключаемся к драйверу базы данных
- 4. Процедуры с выходными параметрами Базы данных: учебный курс Изменим наш пример таким образом, чтобы процедура формировала
- 5. JDBC – Работа с выходными параметрами Базы данных: учебный курс // Подготавливаем вызов хранимой процедуры CallableStatement
- 6. JDBC – Работа с именованными параметрами Базы данных: учебный курс // Подготавливаем вызов хранимой процедуры CallableStatement
- 7. Более сложные процедуры Базы данных: учебный курс CREATE FUNCTION dbo.WeekDay(@day INT) RETURNS VARCHAR(20) AS BEGIN RETURN
- 8. Более сложные процедуры Базы данных: учебный курс CREATE PROCEDURE CreateWeek @first INT = 0 AS BEGIN
- 9. Другие объекты в БД Базы данных: учебный курс Представления (VIEW): виртуальные таблицы Новое представление создается с
- 10. Другие объекты в БД Базы данных: учебный курс Функции, возвращающие таблицу Представления не могут быть параметризованы.
- 12. Скачать презентацию
Слайд 2Процедуры
Базы данных: учебный курс
Синтаксис для создания процедур может различаться в различных БД.
Вот
Процедуры
Базы данных: учебный курс
Синтаксис для создания процедур может различаться в различных БД. Вот
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
Слайд 3JDBC – Создание и вызов процедур
Базы данных: учебный курс
// Подключаемся к драйверу
JDBC – Создание и вызов процедур
Базы данных: учебный курс
// Подключаемся к драйверу
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
Слайд 5JDBC – Работа с выходными параметрами
Базы данных: учебный курс
// Подготавливаем вызов хранимой
JDBC – Работа с выходными параметрами
Базы данных: учебный курс
// Подготавливаем вызов хранимой
CallableStatement cst = conn.prepareCall("Exec CreateWeek ?, ?"); // Подготавливаем параметры (входные и выходные) cst.setInt(1, 0); cst.registerOutParameter(2, Types.INTEGER);
// Осуществляем вызов
cst.execute(); // Доступ к значению выходного параметра: System.out.println(cst.getInt(2));
Слайд 6JDBC – Работа с именованными параметрами
Базы данных: учебный курс
// Подготавливаем вызов хранимой
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 VARCHAR(20) AS
BEGIN
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 = 0
AS
BEGIN
DECLARE
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 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Другие объекты в БД
Базы данных: учебный курс
Функции, возвращающие таблицу
Представления не могут быть
Другие объекты в БД
Базы данных: учебный курс
Функции, возвращающие таблицу
Представления не могут быть
Сначала создадим «общую виртуальную таблицу процентов»
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