Виклик збереженої процедури

збереженої

Ласкаво просимо до форуму.

Тема: "Світ Interbase.." або "FireBird.." Що вибрати

У зв'язку з цим питання:

  • Яка з цих книг доступніша для новачка, який тільки починає вивчати СУБД і проектування БД
  • Якою мірою ці книги, так би мовити, взаємозамінні. Тобто. наскільки знання, отримані з книги про InterBase(наприклад), застосовні для роботи з FireBird і навпаки.

Заздалегідь дякую всім за відповіді.

З повагою, Londinium

1. Якщо ти зовсім новенький, то бери першу - в ній доступніше.

2. Якщо ти новенький тільки в ІБ, то краще другу.

3. Другу книжку бажано мати під рукою по-любому незалежно від того, чи є перша.

4. Важливо - у другій немає ніхрену (здається) про бібліотеки доступу (IBX, FIBPlus).

5. Знання про InterBase, отримані з першої книги, можна застосувати до FireBird практично в повному обсязі.

Світ InterBase. Архітектура, адміністрування та розробка додатків баз даних у InterBase/FireBird/Yaffil

Виклик збереженої процедури

Виклик збереженої процедури

Але повернемося до нашої процедури, що зберігається. Тепер, коли вона створена, її треба якось викликати, передати їй параметри і отримати результати, що повертаються. Це зробити дуже просто – достатньо написати SQL-запит наступного вигляду:

FROM Sp_add (181.35, 23.09)

Цей запит поверне нам один рядок, що містить лише одне поле Result, в якому буде перебувати сума чисел 181.35 і 23.09, тобто 204.44.

Таким чином, нашу процедуру можна використовувати у звичайних SQL-запитах, що виконуються як у клієнтських програмах, так і в інших ХП або тригерах. Таке використання нашої процедури стало можливим через застосування команди SUSPEND в кінці процедури, що зберігається.

Справа в тому, що в InterBase (і у всіх його клонах) існують два типи процедур, що зберігаються: процедури-вибірки (selectable procedures) і виконувані процедури (executable procedures). Відмінність у роботі цих двох видів ХП полягає в тому, що процедури-вибірки зазвичай повертають безліч наборів вихідних параметрів, згрупованих рядково, які мають вигляд набору даних, а процедури, що виконуються, можуть або взагалі не повертати параметри, або повертати тільки один набір вихідних параметрів, перерахованих в Returns, де один рядок параметрів. Процедури-вибірки викликаються у запитах SELECT, а процедури, що виконуються, - за допомогою команди EXECUTE PROCEDURE.

Обидва види процедур, що зберігаються, мають однаковий синтаксис створення і формально нічим не відрізняються, тому будь-яка здійснена процедура може бути викликана в SELECT-запиті і будь-яка процедура-вибірка - за допомогою EXECUTE PROCEDURE. Питання в тому, як поведуться ХП при різних типах виклику. Іншими словами, різниця полягає у проектуванні процедури для певного типу виклику. Тобто процедура-вибірка спеціально створюється для виклику із запиту SELECT, а процедура, що виконується, - для виклику з використанням EXECUTE PROCEDURE. Давайте розглянемо, у чому полягають відмінності при проектуванні цих двох видів ХП.

Щоб зрозуміти, як працює процедура-вибірка, доведеться трохи заглибитися в теорію. Давайте уявімо звичайний SQL-запит виду SELECT ID, NAME FROM Table_example. В результаті його виконання ми отримуємо на виході таблицю, що складається з двох стовпців (ID і NAME) та деякої кількості рядків (що дорівнює кількості рядків у таблиці Table_example). Таблиця, що повертається в результаті цього запиту, називається також набором даних SQL. Замислимося ж, як формується набір даних під часвиконання цього запиту Сервер, отримавши запит, визначає, яких таблиць він належить, потім з'ясовує, яке підмножина записів із цих таблиць необхідно включити до результату запиту. Далі сервер зчитує кожен запис, що задовольняє результатам запиту, вибирає з нього потрібні поля (у разі це ID і NAME) і відсилає їх клієнту. Потім процес повторюється знову - і так для кожного відібраного запису.

Все це відступ потрібне для того, щоб шановний читач зрозумів, що всі набори даних SQL формуються рядково, у тому числі і в процедурах, що зберігаються! І основна відмінність процедур-вибірок від процедур, що виконуються в тому, що перші спроектовані для повернення безлічі рядків, а другі - тільки для одного. Тому вони застосовуються по-різному: процедура-вибірка викликається за допомогою команди SELECT, яка "вимагає" від процедури віддати всі записи, які вона може повернути. Процедура, що виконується, викликається за допомогою EXECUTE PROCEDURE, яка "виймає" з ХП тільки один рядок, а решта (навіть якщо вони є!) ігнорує.