Слайд 2
Для реализации логики приложения на стороне базы данных
Создание
хранимых процедур и функций
Создание триггеров
Слайд 4
Вызов встроенной функции
SELECT SQRT(5)
Слайд 5
Преобразование типов данных
CAST ( expression AS data_type
[ ( length ) ] )
CAST ( $10.50 AS
VARCHAR(10) )
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
CONVERT(VARCHAR(12), GETDATE(), 1)
'2'+4
Слайд 6
Примеры
CAST (expression AS data_type [ (length ) ]
)
select cast('12' as int)+45
57
select cast(27 as char(2))+'R‘
27R
select cast(27 as
char(1))+'R‘
*R
Слайд 7
Код символа
Select ASCII('A'), ASCII('a')
97 65
select CHAR(98)
B
select CHAR(ASCII('B')+2)
D
Слайд 8
Группировка
BEGIN
{
sql_statement |
statement_block
}
END
Слайд 9
Условный оператор
IF Boolean_expression { sql_statement | statement_block }
[ ELSE { sql_statement | statement_block }
]
Слайд 10
Метки
Определение метки:
label:
Переход:
GOTO label
Слайд 11
Оператор цикл
WHILE Boolean_expression
{ sql_statement
| statement_block | BREAK | CONTINUE }
BREAK
Приводит к
выходу из ближайшего цикла WHILE.
CONTINUE
Выполняет цикл WHILE для перезагрузки, не учитывая все инструкции, следующие после ключевого слова CONTINUE.
Слайд 12
Выражение CASE
SELECT ProductNumber, Category =
CASE ProductLine
WHEN 'R' THEN
'Road'
WHEN 'M' THEN 'Mountain'
WHEN 'T' THEN 'Touring'
WHEN 'S' THEN 'Other sale items'
ELSE 'Not for sale'
END,
Name
FROM Production.Product
ORDER BY ProductNumber;
Слайд 13
Выражение CASE
SELECT a,
CASE
WHEN a = 1 THEN b
WHEN a=2 THEN c
WHEN a>2 THEN b+c
END
FROM t2
Слайд 14
Обработка исключений
CREATE TABLE dbo.TestRethrow
( ID INT PRIMARY
KEY);
BEGIN TRY
INSERT dbo.TestRethrow(ID) VALUES(1);
-- Force error 2627,
Violation of PRIMARY KEY constraint to be raised.
INSERT dbo.TestRethrow(ID) VALUES(1);
END TRY
BEGIN CATCH
PRINT 'In catch block.';
THROW;
END CATCH;
Слайд 15
Процедуры
Хранимая процедура – это набор операторов T-SQL, который компилируется
системой SQL Server в единый "план исполнения".
Слайд 16
Переменные
DECLARE @var_name var_type, …
SET @var_name = var_value;
SELECT @var_name;
Слайд 17
Процедуры
CREATE PROC [ EDURE ] procedure_name
[ {
@parameter data_type }
[ = default ] [
OUTPUT ]
] [ ,...n ]
AS sql_statement
Слайд 18
Создание простой процедуры
CREATE PROCEDURE SimpleProc AS
UPDATE TOP (5)
students
SET salary=salary*1.5;
Слайд 19
Изменение простой процедуры
ALTER PROCEDURE SimpleProc AS
UPDATE TOP (5)
students
SET salary=salary*1.5;
Слайд 20
Создание процедуры с удалением
IF OBJECT_ID (' SimpleProc ')
IS NOT NULL
DROP PROCEDURE SimpleProc;
CREATE PROCEDURE SimpleProc AS
UPDATE students
SET salary=salary*1.5;
Слайд 21
Процедуры: несколько действий
CREATE PROCEDURE ExampleProc AS
BEGIN
DECLARE @default_salary INT
SET
@default_salary = (SELECT …)
END
Слайд 22
Создание процедуры с параметрами
CREATE PROCEDURE ExampleProc (
@id INT,
@name
VARCHAR(32)
) AS
BEGIN
DECLARE @default_salary INT
SET @salary = (SELECT …)
END
Слайд 23
Вызов процедур
Без параметров
EXECUTE SimpleProc
EXEC SimpleProc
С параметрами
EXECUTE ExampleProc
1, ‘string’
Слайд 24
Параметры
по умолчанию и внешние
CREATE PROCEDURE ExampleProc (
@id
INT = 0,
@name VARCHAR(32) = '',
@salary INT OUTPUT
) AS
BEGIN
DECLARE
@default_salary INT
SET @salary = (SELECT …)
END
Слайд 25
Создание процедуры с параметрами
CREATE PROCEDURE GetUnitPrice @prod_id int,
@unit_price money OUTPUT
AS SELECT @unit_price = UnitPrice
FROM
Products WHERE ProductID = @prod_id
DECLARE @price money
EXECUTE GetUnitPrice 77, @price OUTPUT
SELECT @price
Слайд 26
Переменные
CREATE PROCEDURE ExampleProc (
@salary INT OUTPUT,
@id INT =
0,
@name VARCHAR(32) = '',
DECLARE @s int;
EXEC ExampleProc @s OUTPUT,
3, ‘any_string‘
EXEC ExampleProc @s OUTPUT
Слайд 27
Переменные
CREATE PROCEDURE ExampleProc (
@id INT = 0,
@name VARCHAR(32)
= '',
@salary INT OUTPUT
EXEC PROCEDURE ExampleProc 3
DECLARE @proc_name
varchar(30) SET @proc_name = 'sp_who' EXEC @proc_name
Слайд 28
Процедура с циклом
CREATE TABLE mytable (
column1 int,
column2 char(10) )
CREATE PROCEDURE InsertRows @start_value int
AS BEGIN
DECLARE @loop_counter int,
@start int
SET @start = @start_value – 1
SET @loop_counter = 0
WHILE (@loop_counter < 5) BEGIN
INSERT INTO mytable VALUES (@start + 1, ‘new row’)
PRINT (@start)
SET @start = @start + 1
SET @loop_counter = @loop_counter + 1
END END
Слайд 29
Процедура с циклом
EXECUTE InsertRows 1 GO
SELECT * FROM
mytable
column1 column2
-----------------------
1 new row
2 new row
3 new row
4 new row
5 new row
Слайд 30
Выход из процедуры RETURN
CREATE PROCEDURE GetUnitPrice
@prod_id int
= NULL
AS
IF @prod_id IS NULL
BEGIN PRINT
‘Enter a product ID number’ RETURN
END
ELSE …
Слайд 31
SELECT-выражения в блоках
Должны возвращать только одно значение!
SET var_name
= (SELECT column_name FROM …)
При необходимости работать со множеством
записей используйте курсор.
Слайд 32
Курсоры
DECLARE – создание или объявление курсора ;
OPEN – открытие курсора, т.е. наполнение его
данными;
FETCH – выборка из курсора и изменение строк данных с помощью курсора;
CLOSE – закрытие курсора ;
DEALLOCATE – освобождение
курсора, т.е. удаление курсора как объекта.
Слайд 33
Создание курсора
DECLARE имя_курсора [INSENSITIVE][SCROLL] CURSOR FOR SELECT_оператор
[FOR
{ READ_ONLY | UPDATE
[OF имя_столбца[,...n]]}]
Слайд 34
Курсоры
DECLARE cursor_name CURSOR FOR select_statement
OPEN cursor_name
FETCH [NEXT] cursor_name
[INTO variable_list]
CLOSE cursor_name
DEALLOCATE cursor_name
Слайд 35
Виды курсоров
последовательные
прокручиваемые
Статические
Динамические
Слайд 36
Статический курсор
В схеме со статическим курсором информация читается из базы
данных один раз и хранится в виде моментального снимка
(по состоянию на некоторый момент времени), поэтому изменения, внесенные в базу данных другим пользователем, не видны. На время открытия курсора сервер устанавливает блокировку на все строки, включенные в его полный результирующий набор. Статический курсор не изменяется после создания и всегда отображает тот набор данных, который существовал на момент его открытия.
Слайд 37
Создаем статический курсор
DECLARE cursor_name INSENSITIVE [ SCROLL ] CURSOR FOR select_statement
Слайд 38
Динамический курсор
Динамические курсоры - это противоположность статических курсоров.
Динамические курсоры отражают все изменения строк в результирующем наборе
при прокрутке курсора. Значения типа данных, порядок и членство строк в результирующем наборе могут меняться для каждой выборки. Все инструкции UPDATE, INSERT и DELETE, выполняемые пользователями, видимы посредством курсора. Обновление видимы сразу, если они сделаны посредством курсора.
Слайд 39
Создаем динамический курсор
DECLARE cursor_name [ SCROLL ] CURSOR FOR select_statement
[ FOR
{ READ ONLY | UPDATE
[ OF column_name [ ,...n ] ] }
]
Слайд 40
DECLARE employee_cursor CURSOR FOR
SELECT id, name FROM employee
DECLARE
@emp_id INT, @emp_name VARCHAR(32)
OPEN employee_cursor
FETCH employee_cursor INTO @emp_id, @emp_name
WHILE
(@@FETCH_STATUS = 0) BEGIN
FETCH employee_cursor INTO @emp_id, @emp_name
END
CLOSE employee_cursor
DEALLOCATE employee_cursor
Последовательный курсор
Слайд 41
DECLARE Employee_Cursor CURSOR FOR
SELECT EmployeeID, Title
FROM AdventureWorks2012.HumanResources.Employee
WHERE
JobTitle = 'Marketing Specialist';
OPEN Employee_Cursor;
FETCH NEXT FROM Employee_Cursor;
WHILE @@FETCH_STATUS
= 0
BEGIN
FETCH NEXT FROM Employee_Cursor;
END;
CLOSE Employee_Cursor;
DEALLOCATE Employee_Cursor;
Последовательный курсор
Слайд 42
Прокручиваемый курсор
DECLARE cursor_name [INSENSITIVE]
SCROLL CURSOR
FOR select_statement
SCROLL – свобода для FETCH
FETCH
[ [ NEXT | PRIOR | FIRST | LAST
|
ABSOLUTE { n | @nvar }
| RELATIVE { n | @nvar } ]
FROM ]
cursor_name
[ INTO @variable_name [ ,...n ]
Слайд 43
Курсоры: усложним
DECLARE cursor_name [ SCROLL ] CURSOR
FOR select_statement
FOR UPDATE
[ OF column_name [ ,...n ] ] } ]
UPDATE – возможность вносить изменения
FETCH
…
UPDATE table_name
SET id=@id+2
WHERE CURRENT OF cursor_name;