MS SQL - Oracle True, або погляд програміста на дві СУБД - ТОВ - Позитик
Програмісти часто поділяються на два клани. Одні люблять Сі, інші Дельфі, і суперечка ця, як правило, безглузда. Зазвичай хто до чого звик, той більше і любить, і вихваляє. Серед систем управління базами даних так само яскраво виділяються два конкуренти MS SQL та Oracle. Обидві системи чудово справляються із завданнями зберігання та доступу до даних, і, в принципі, досить досвідченому програмісту не буде проблем взяти будь-яку з них на озброєння, але. Але ряд особливостей все ж таки дозволяє зробити припущення, що MS SQL ближче до людей, менш вимогливий до досвіду роботи з системою, все лежить на поверхні.
Щоб не бути голослівним, розглянемо кілька прикладів. Відмінностей у вибірці ви практично не знайдете. Різниця тільки буде у додаткових функціях, специфічних для систем:
Те саме в MS SQL:
Взагалі, то в Ораклі можна не користуватися специфічною функцією decode, а використовувати той же CASE. І навіть склеювання таблиць не обов'язково робити (+), можна використовувати LEFTRIGHT OUTERINNER JOIN Щоправда остання можливість з'явилася лише у версії Oracle 9. Можна вважати, що відмінностей у вибірці немає, але є одна особливість. Спробуйте вибрати значення змінної:
У Oracle така конструкція супроводжується обробником помилок, оскільки варто запиту не повернути жодного запису - виникне виняток і код не виконається. MS SQL перетравить це в легку, нагородивши змінну @nSum значенням NULL. На мою думку, це більш логічно, ніж щоразу робити такі перевірки, нагромаджуючи код. Можна ще піти в обхід:
І, тим не менш, код на MS SQL мені здається лаконічнішим. Хоча якщо ще згадати, що в конструкції INTO можна вказувати перелік змінних, то мої причіпки можна звестинанівець. Ну, це все дрібниці насправді. Справа смаку.
А тепер про серйозне. Чи знаєте ви, що таке тимчасові таблиці та навіщо вони потрібні?
Тимчасова таблиця в MS SQL - це фіктивна таблиця (не існує фізично), у якому можна вивантажити набір даних, отриманий SQL-запросом, і використовуватиме наступного SQL запиту. Цю таблицю зовсім необов'язково описувати, досить просто задати їй ім'я, що починається з символу якщо хочете, щоб ця таблиця існувала, на час виконання процедури, або якщо хочете, щоб до неї мали доступ і інші процедури. Така таблиця автоматично зруйнується після завершення сесії. Таким чином, варто вам написати:
І у вас є таблиця #my_table, яка містить вибраний вами набір записів. Вибрали, перепочили, і тепер можете її використовувати для подальшої вибірки:
Зауважимо, MS SQL виконав вибірку у тимчасову таблицю, і він її знає та пам'ятає дані в ній. Що нам запропонує на це Оракл? Можна вставити першу вибірку у трьох місцях другого селекту, викинувши тимчасову таблицю. Отримаємо громіздкий і нераціональний селект, який при виконанні тричі отримуватиме одні й ті самі дані. Можна скористатися курсором. І замість простої вибірки написати цілу програму, згадавши if, for, завівши змінні і т.д.
Але це ще не все. Ви помітили, куди вставляються дані в попередньому прикладі? В якусь таблицю my_table. А що вона собою являє? Не інакше як фізична таблиця. Вона взялася не сама собою. Її ще треба заздалегідь створити. Описати колонки, типи тощо. Однак, тут варто зазначити, що в Ораклі теж є "тимчасові" таблиці, GLOBAL TEMPORARY TABLE. Але тільки за зручністю використання вони нічим не відрізняються від фізичних таблиць. Її також треба створити. Причомукоманду CREATE TABLE не можна виконати безпосередньо у процедурі. Правда є можливість скористатися динамічним SQL, але знову ж таки. Ми постійно натикаємось на граблі і намагаємось їх обминати. Але не без подряпин. Зокрема після виконання:
відбудеться неявний commit та відкотити зміни ви вже не зможете. Тим не менш, в даному випадку тимчасові таблиці Oracle це інструмент швидше для адміністратора, а не для програміста, і зовсім не має спільного з тимчасовими таблицями MS SQL, крім назви.
Зверніть увагу, якщо в результаті виконання процедури ми хочемо отримати набір даних, то нам потрібно підготувати для нього таблицю. А що нам пропонує MS SQL? А елементарно він пропонує результуючу вибірку в процедурі написати без ключового слова into, тобто не вставляти цей набір кудись у таблицю. Тоді результатом виконання процедури повернеться набір цих даних. Як? Та ось так. Ви викликаєте процедуру
А вам прилітає з сервера набір даних, ніби ви виконали select:
Чи не здорово? Якщо ви не можете одним селектом вибрати дані, просто пишіть процедуру, в якій послідовно оформите вибірки даних у тимчасові таблиці, і зав'яжіть їх у той набір даних, який вам потрібен на виході. І все, процедура поверне вам необхідні дані.
Але тут, звичайно, не все правда - в Ораклі це також можна реалізувати, тільки рішення лежить не на поверхні, а криється в нетрях Oracle. Є таке поняття "курсорна змінна". Тобто можна в процедурі відкрити курсор і повернути через вихідний параметр цей набір даних:
Але коли ви вже зрозуміли, як це все працює, і з пристрастю почали писати процедуру, ви знову зустрічаєте затримку. Як описати вихідний параметр як курсорну змінну, якщо спочатку потрібно описати тип курсорноїзмінної?
Як же її описати вище заголовка процедури? Рішення полягає в тому, що цей тип можна описати в специфікації пакета, а потім на нього посилатися, оголошуючи параметри процедури
Ну, загалом, досягти мети вдалося, але скільки часу втратили, поки продумали весь механізм, чи перейняли досвід старших товаришів?
Можливо тому я рідко зустрічав, щоб таким методом користувалися на практиці. А в MS SQL це саме напрошується, навіть уявити не можу, як не скористатися. Але можна зробити ще сміливіше припущення, чому не користується популярністю такий метод в Oracle. Певне, не всім хочеться розбиратися з курсорними змінними, та й наочність втрачається. Коли ви налагоджуєте процедуру, що готує набір даних, ви зазвичай не будете щоразу відкривати Клієнта і дивитися, що в нього повернулося. Більше наочно подивитися, що ж процедура вставила в таблицю. Можливо тому менше проблем все ж таки її створити. У MS SQL саме навпаки, при введенні в текст курсорів ніяких психологічних бар'єрів долати не доводиться. Просто пишемо селект і все. Крім того, під час налагодження можемо швидко подивитися, що у нас підготувалося у проміжних тимчасових таблицях, вставивши у будь-яке місце процедури вибірку цієї таблиці.
Підсумовуючи, можна сказати, що MS SQL простіша і зручніша СУБД і користуватися нею можна не маючи великого запасу знань. І необхідності користуватися Oracle, якщо ви не вирішуєте якесь дуже специфічне завдання, або, наприклад, хочете ставити базу не на платформу Widows - не бачу. Це надмірність, а вона не завжди корисна в результаті. Залишається тільки побажати небагатьом програмістам, кому пощастить опинитися біля витоків нового проекту, будьте розумні з вибором сервера. Вам з ним працювати тапрацювати.
Обговорити статтю можна тут.
Будемо раді бачити вас серед наших клієнтів!