
- •Крещенко л.Ф. Мова sql
- •Навчальна програма дисципліни«Мова sql»
- •Методичні рекомендації до вивчення дисципліни Тема 1. Основи роботи з Microsoft sql| Server| 2005
- •1. Основні відомості про|із|sql|Server|2005 та принципи його роботи
- •Що таке sql Server 2005
- •Бази даних
- •Реляційні бази даних
- •2. Використання sql|Server|Management|Studio|
- •Створення|створіння|запитів
- •Тема 2. Створення і керування базою даних sql Server
- •1. Створення бази даних у середовищі ms sql Server 2005
- •Методи створення бази даних sql Server
- •Оператор create database
- •Керування базою даних sql Server
- •Видалення бази даних sql Server
- •Приклад створення і керування базою даних
- •Перегляд бази даних BookShopDb
- •Видалення бази даних за допомогою оператора drop database
- •2. Створення таблиць у базі даних та накладання обмежень
- •Визначення типів даних
- •Системні типи даних
- •Користувальницькі типи даних
- •Цілісність даних
- •Цілісність, обумовлена користувачем
- •Практична реалізація створення таблиць та забезпечення цілісності даних Перегляд існуючих таблиць, стовпців і їхніх типів даних
- •Створення таблиць і керування ними
- •Створення таблиць у базі даних sql Server
- •Реалізація обмежень, що забезпечують цілісність
- •Загальні відомості про обмеження, що забезпечують цілісність
- •Визначення можливості зберігання порожніх значень (null)
- •Визначення значень за замовчуванням (default)
- •Автоматична нумерація й стовпці з ідентифікатором (identity)
- •Створення стовпців з ідентифікатором
- •Властивість identity
- •Обмеження primary key
- •Створення обмежень primary key
- •Обмеження unique
- •Створення обмежень unique
- •Обмеження foreign key
- •Створення обмежень foreign key
- •Обмеження check
- •Створення обмежень check
- •Модифікація таблиць у базі даних sql Server
- •Видалення таблиці з бази даних sql Server
- •Створення таблиці Authors у базі BookShopDb
- •Створення таблиць BookAuthors і BookCondition у базі даних BookShopDb
- •Тема 3. Синтаксичні елементи мови Transact-sql
- •1.Ідентифікатори
- •Звичайні ідентифікатори
- •Ідентифікатори з обмежниками
- •2. Функції та інші конструкції мови
- •Убудовані функції
- •Функції одержання набору рядків
- •Агрегатні функції
- •Скалярні функції
- •Користувальницькі функції
- •Типи користувальницьких функцій
- •Детермінованість функцій
- •3. Типи даних та фирази
- •Коментарі
- •Приклади. Створення сценаріїв за допомогою синтаксичних елементів мови Transact-sql
- •Сценарії Trarisact-sql
- •Тема 4 Вибірка даних з бази даних sql Server
- •1. Основи оператора select
- •Конструкція select
- •Використання ключових слів у списку вибору
- •Ключове слово distinct
- •Ключове слово top n
- •Ключове слово as
- •Типи інформації в списку вибору
- •Конструкція into
- •Конструкція from
- •Конструкції where, group by і having
- •Конструкція group by
- •Обробка конструкцій where, group by і having
- •Конструкція order by
- •Витяг всіх даних з таблиці Titles
- •Одержання даних з певних стовпців таблиці Titles
- •Завдання умови, якій повинен відповідати результуючий набір
- •Угруповання даних у результуючому наборі
- •2.Витяг даних за допомогою з'єднань
- •Внутрішні з'єднання
- •Зовнішні з'єднання
- •Використання лівих зовнішніх з'єднань
- •Використання правих зовнішніх з'єднань
- •Використання повних зовнішніх з'єднань
- •3.Визначення підзапитів усередині операторів select
- •Типи підзапитів
- •Підзапити із ключовими словами in або not in
- •Підзапити з операторами порівняння
- •Підзапити із ключовими словами exists і not exists
- •Узагальнення даних
- •Узагальнення даних за допомогою оператора cube
- •Узагальнення даних за допомогою оператора rollup
- •Приклади
- •Одержання даних за допомогою повного зовнішнього з'єднання
- •Тема 5. Модифікація даних у базах даних sql Server
- •1. Додавання даних у бд sql Server
- •Додавання даних за допомогою оператора insert
- •Insert [into] таблиця_або_відображення
- •Додавання даних за допомогою оператора insert...Values
- •Додавання даних за допомогою підзапиту select
- •Додавання даних за допомогою оператора select...Into
- •Додавання у вставлені рядки даних типу ntext, text і image
- •Додавання даних за допомогою операцій масового копіювання
- •2. Модифікація даних у бд sql Server
- •Модифікація даних за допомогою оператора update
- •Модифікація даних за допомогою конструкції set
- •Модифікація даних за допомогою конструкції where
- •Модифікація даних за допомогою конструкції from
- •Модифікація даних за допомогою api і курсорів
- •Модифікація даних типу ntext, text і image
- •3. Видалення даних із бд sql Server
- •Видалення даних оператором delete
- •Видалення даних за допомогою api і курсорів
- •Видалення даних за допомогою оператора truncate table
- •Практичні приклади модифікації даних у бд sql Server
- •Тема 6. Збережені процедури
- •1. Основні відомості про збережені процедури
- •Продуктивність
- •Можливості програмування
- •Безпека
- •2. Операції зі збереженими процедурами
- •Збереження процедури
- •Методи створення збережених процедур
- •Передача контексту збереженій процедурі
- •Виконання збереженої процедури
- •Виклик збереженої процедури
- •Визначення параметрів і їхніх значень
- •Модифікація збереженої процедури
- •Видалення збереженої процедури
- •Приклади роботи зі збереженими процедурами
- •Приклади програмування збережених процедур
- •Тема 7. Створення|створіння|тригерів|трігерів|і керування ними
- •1. Створення|створіння|тригерів|трігерів|за допомогою мови|язика|transact-sql|
- •Конструкція on|
- •Конструкції for|, after|і instead|of|
- •Конструкція as|
- •Управління тригерами|трігерами|
- •Зміна і перейменування тригерів
- •Перегляд|проглядати|, видалення|віддалення|і відключення тригерів|трігерів|
- •2. Програмування тригерів|трігерів| Псевдотаблиці Inserted|і Deleted|
- •План практичних занять Практичні заняття 1,2 (4 години)
- •Перелік завдань для модуля
- •Індивідуальні завдання для самостійної роботи студентів
- •Порядок і критерії оцінювання знань студентів
- •Перелік питань для підготовки до поточного модульного контролю
- •Розподіл балів, що отримають студенти за результатами вивчення дисципліни «Мова sql»
- •Система нарахування балів за видами навчальної роботи
- •Список рекомендованої літератури
Приклади програмування збережених процедур
Збережені процедури істотно розширюють можливості програмування мовою Transact-SQL. У наступних прикладах детальніше розглянемо використанню вхідних і вихідних параметрів.
Параметри і змінні - основа динамічності збережених процедур. Вхідні параметри дозволяють користувачеві, що виконує процедуру, передавати процедурі різні значення і одержувати в кожному випадку конкретні унікальні результати. Вихідні параметри дозволяють одержувати не тільки результуючий набір, але й додаткові відомості. Під час виконання процедури значення вихідних параметрів зберігаються в пам'яті. Щоб одержати значення вихідного параметра, необхідно створити змінну для його зберігання. Отримане значення можна відобразити за допомогою команд SELECTіPRINTабо використати його для виконання інших команд процедури.
Вхідні параметри ми вже застосовували раніше - при створенні збереженої процедури CustOrderHistRepвикористали вхідний параметр@CustomerID, якому перед виконанням процедури привласнювали значенняthecr.
Вхідний параметр визначають у збереженій процедурі, а його значення задають при її виконанні. Вихідний параметр збереженої процедури визначається за допомогою ключового слова OUTPUT. При виконанні процедури значення вихідного параметра зберігається в пам'яті. Щоб використати його, необхідно оголосити змінну для зберігання цього значення. Як правило, вихідні значення відображаються після завершення виконання процедури. Використання вхідних і вихідних параметрів ілюструє наступна процедура:
USE Pubs
GO
CREATE PROCEDURE dbo.SalesForTitle
@Title varchar(80),
@YtdSales int OUTPUT,
@TitleText varchar(80) OUTPUT
AS
SELECT @YtdSales = ytd_sales, @TitleText=title
FROM titles WHERE title LIKE @Title
GO
@Title- це вхідний параметр, а вихідні —@YtdSalesі@TitleText. Зверніть увагу, що для всіх трьох параметрів визначений тип даних. У визначенні вихідних параметрів присутнє обов'язкове ключове словоOUTPUT. Всі параметри після визначення застосовуються в операторіSELECT. Спочатку значення вихідних параметрів встановлюються рівними іменам стовпців у запиті. Під час виконання запиту у вихідних параметрах будуть зазначені значення із цих двох стовпців. У конструкціїWHEREоператораSELECTє присутнім вхідний параметр@Title. При виконанні цієї процедури необхідно задати значення вхідного параметра, інакше запит не виконається. Наступний оператор виконує процедуруSalesForTitle:
-- Оголосити змінні, що одержують вихідні значення процедури.
DECLARE @y_YtdSales int, @t_TitleText varchar(80)
EXECUTE SalesForTitle
@YtdSales = @y_YtdSales OUTPUT,
@TitleText = @t_TitleText OUTPUT,
@Title = "%Garlic%"
Select "Title" = @t_TitleText. "Number of Sales" = @y_YtdSales
GO
Оголошуються дві змінні: @y_YtdSales і@t_TitleText. Вони одержують значення, які зберігаються у вихідних параметрах. Зверніть увагу, що типи даних, оголошені для цих змінних, збігаються з типами даних відповідних вихідних параметрів. Ці змінні можуть мати ті ж імена, що й вихідні параметри, оскільки в збережених процедурах змінні локальні для пакета, у якому вони оголошені. Для ясності тут використані імена змінних, відмінні від імен вихідних параметрів. При оголошенні змінної її значення не збігається зі значенням вихідного параметра. Значення змінних стають рівними значенням вихідних параметрів лише після виконання оператора EXECUTE. Зверніть увагу, що після присвоєння змінним значень параметрів задане ключове слово OUTPUT. Без нього оператор SELECT, розташований наприкінці пакета, не зможе вивести значення змінних. Зверніть також увагу на значення вхідного параметра@Title, що дорівнює%Garlic%.Це значення передається в конструкцію WHERE оператора SELECT збереженої процедури. Оскільки в конструкції WHERE зазначене ключове словоLIKE, можна використати знаки підстановки, наприклад%. Отриманий у результаті запит настроєний на пошук заголовків, у яких утримується слово«Garlic».
Нижче показаний більше простий спосіб виконання процедури. Зверніть увагу, що зовсім не обов'язково явно привласнювати змінним збереженої процедури значення вхідного параметра або оголошених тут вихідних змінних:
DECLARE @y_YtdSales int, @t_TitleText varchar(80)
EXECUTE SalesForTitle
"%Garlic%"
@y_YtdSales OUTPUT,
@t_TitleText OUTPUT
Select "Title" = @t_TitleText, "Number of Sales" = @y_YtdSales
GO
Особливість цієї процедури в тім, що вона повертає єдиний рядок. Навіть якщо оператор SELECTіз процедури повертає кілька рядків, у кожної змінній зберігається тільки одне значення (дані з останнього повернутого рядка). Способи рішення цієї проблеми, описані далі.
Оператор RETURN і обробка помилок
Часто основні зусилля при програмуванні якісних збережених процедур (та й будь-яких програм) витрачаються на реалізацію обробки помилок. SQL Server надає функції і оператори для обробки помилок, що виникають під час виконання процедури. Помилки можна розділити на дві основні категорії: пов'язані з комп'ютерами, наприклад, коли недоступний сервер баз даних, і користувальницькі. Для обробки помилок, що виникають під час виконання процедур, використовуються коди повернення й функція @@ERROR.
Коди повернення придатні не тільки для обробки помилок. Оператор RETURNвикористовується для генерації кодів повернення і виходу з пакету, він може повернути програмі, яка викликала процедуру будь-яке цілочислене значення. У цьому розділі показані приклади програм, у яких операторRETURNповертає значення для обробки помилок і інших цілей. ОператорRETURNвикористовується головним чином для обробки помилок, оскільки при виконанні цього оператора виконується безумовний вихід із процедури.
Для користувача більш корисне повідомлення про відсутність записів, що відповідають запиту. У наступному прикладі показано, як модифікувати збережену процедуру SalesEorTitle, щоб задіяти операторRETURN(і створити більше інформативне повідомлення для користувача):
ALTER PROCEDURE dbo.SalesForTitle
@Title varchar(80),
@YtdSales int OUTPUT.
@TitleText varchar(80) OUTPUT
AS
IF (SELECT COUNT(*) FROM titles WHERE title LIKE @Title) = 0
RETURN(1)
ELSE
SELECT @YtdSales = ytd_sales, @TitleText=title
FROM titles WHERE title LIKE @Title
GO
Оператор IF після ключового словаASвизначає, чи заданий вхідний параметр при виконанні процедури і чи відповідають йому які-небудь записи в базі даних. Якщо функціяCOUNTповертає 0, то код повернення встановлюється рівним 1:RETURN(1). Якщо функціяCOUNTповертає значення, відмінне від 0, то операторSELECTзапитує з таблиціTitlesрічний обсяг продажу і відомості про видання. У цьому випадку код повернення дорівнює 0.
Щоб задіяти коди повернення, прийде перепрограмувати оператори для виконання процедури. У наступному прикладі вхідному параметру @Title привласнюється значення Garlic%;
DECLARE @y_YtdSales int, @t_Titl-@Text varchar(80), @r_Code int
EXECUTE @r_Code = SalesForTitle
@YtdSales = @y_YtdSales OUTPUT,
@TitleText = @t_TitleText OUTPUT
@Title = "Garlic%"
IF @r_Code = 0
SELECT "Title" = @t_TitleText,
"Number of Sales" = @y_YtdSales,
"Return Code" = @r_Code
ELSE IF @r_Code = 1
PRINT 'No matching titles in the database. Return code=' + CONVERT(varchar(1),ir_Code)
GO
До оператора DECLAREбула додана нова змінна -@r_Code. Далі ця змінна зберігає значення, що повертає операторомRETURN. Вона визначена як цілочислена, оскільки код повернення передається як ціле число. У рядку з операторомEXECUTEзмінній@r_Codeпривласнюється значення коду повернення. Зверніть увагу, що змінна@r_Codeмістить значення, що повертає збережена процедура. Тепер замість%Garlic%для вхідного параметра@Titleзадане значенняGarlic%.Інакше кажучи, операторSELECTбуде шукати в таблиціTitlesвидання, назви яких починаються зі слова “Garlic”. Нижче параметрів і коментарю розміщена умова. Спочатку виконується перевірка галузі операторомIF. Якщо процедура знаходить запис, код повернення дорівнює 0 і виконується операторSELECT. Якщо процедура не знаходить ні одного відповідного запису, змінна@r_Codeдорівнює 1 і виконується операторPRINT. Оскільки в базі даних немає книги, заголовок якої починається зі слова“Garlic”,результат процедури визначає оператор PRINT:
No matching titles in the database. Return code-1
Якщо змінити значення вхідного параметра на %Garlic%і виконати процедуру ще раз, то вона поверне результуючий набір, показаний у наступній таблиці.
Title Number of Sales Return Code
Onions, Leeks, and Garlic: Cooking 375 0
Методи добування наборів даних
У процедурі, яка використовується як приклад, є обмеження: вона може повернути не більше одного рядка даних. Наприклад, якщо вхідний параметр дорівнює «The%», процедура поверне єдиний рядок - останній запис про книгу, заголовок якої починається з«The%».
Виводиться єдиний рядок, оскільки результуючий набір оператора SELECTпередається змінній, здатній зберігати тільки одне значення. Ця проблема має кілька рішень. Найпростіше полягає у відмові від використання вихідних параметрів в операторіSELECTі поверненні при виконанні процедури набору записів, як показано нижче:
ALTER PROCEDURE dbo.SalesForTitle
@Title varchar(80)
AS
SELECT Title = title, [Number of Sales]=ytd_sales
FROM titles WHERE title LIKE @Title
GO
Зверніть увагу, зі збереженої процедури вилучені всі вихідні параметри. Цю просту збережену процедуру можна виконати за допомогою наступного коду:
EXFCUTE SalesForTitle
@Title = "The%"
При виконанні ця процедура повертає результуючий набір, показаний у наступній таблиці.
Title Number of Sales
The Busy Executive's Database Guide 4095
The Gourmet Microwave 22.246
The Psychology of Computer Cooking NULL
Для простоти зі збереженої процедури вилучені фрагменти з кодами повернення, тому стовпець Return Codeвідсутній. У результуючому наборі перераховані всі книги, заголовок яких починається з“The%”.