В інформатиці курсор бази даних — керувальна структура, яка забезпечує обхід записів у базі даних. Курсори полегшують подальшу обробку в поєднанні з обходом, як-от отримання, додавання та видалення записів бази даних. Характеристика обходу курсору бази даних наближує курсори до поняття ітератора в мовах програмування.
Курсори використовуються програмістами баз даних для обробки окремих рядків, які повертаються запитами до систем бази даних. Курсори дозволяють одночасно маніпулювати цілими результатними наборами. У цьому сценарії курсор забезпечує послідовну обробку рядків у результатному наборі.
У процедурах SQL курсор уможливлює визначення результатного набору (набору рядків даних) та виконує складну логіку на порядковій основі. Використовуючи ту саму механіку, процедура SQL також може визначати результатний набір і повертати її безпосередньо тому, хто викликає процедуру SQL, або клієнтському застосунку.
Курсор можна розглядати як указівник на один рядок у наборі. Курсор може посилатися лише на один рядок за раз, але за необхідності може переміщуватися до інших рядків результатного набору.
Використання
Для використання курсорів у процедурах SQL необхідно зробити наступне:
- Оголосити курсор, який визначає результатний набір.
- Відкрити курсор для встановлення результатного набору.
- Витягнути дані у необхідні локальні змінні з курсору, по одному рядку за раз.
- Закрити курсор після завершення.
Для роботи з курсорами необхідно використовувати наступні інструкції SQL
У цьому розділі представлено способи, якими стандарт SQL:2003 визначає, як використовувати курсори в застосунках у вбудованому SQL. Не всі прив'язки застосунків для реляційних систем баз даних дотримуються цього стандарту, а деякі (наприклад, [en] або JDBC) використовують інший інтерфейс.
Програміст робить курсор відомим для СКБД за допомогою інструкції DECLARE … CURSOR
і призначення курсору (обов'язкового) імені:
DECLARE «назва_курсору» CURSOR IS SELECT … FROM …
Перш ніж код може отримати доступ до даних, він повинен відкрити курсор за допомогою інструкції OPEN
. Безпосередньо після успішного відкриття курсор розташовується перед першим рядком результатного набору.
OPEN «назва_курсору»
Програми позиціюють курсори на конкретному рядку в результатному наборі інструкцією FETCH
. Операція витягнення передає дані рядка до застосунку.
FETCH «назва_курсору» INTO …
Щойно застосунок обробив усі доступні рядки чи операція витягнення має позиціюватися на неіснуючому рядку (пор. прокручувані курсори нижче), СКБД повертає SQLSTATE «02000» (зазвичай супроводжується SQLCODE +100) для позначення кінця результатного набору.
Останній крок передбачає закриття курсору з використанням інструкції CLOSE
:
CLOSE «назва_курсору»
Після закриття курсора програма може знову його відкрити, що означає переоцінку СКБД того самого чи іншого запиту та побудову нового результатного набору.
Прокручувані курсори
Програмісти можуть оголошувати курсори прокручуваними чи ні. Прокручуваність позначає напрямок переміщення курсору.
З непрокручуваними (або лише вперед) курсорами можна FETCH
кожен рядок щонайбільше один раз, а курсор автоматично переміщується до наступного рядка. Після витягнення останнього рядка та спроби наступного витягнення курсор розміщується після останнього рядка, що видає наступний код: SQLSTATE 02000 (SQLCODE +100).
Програма може позиціювати прокручуваний курсор будь-де в результатному наборі, використовуючи інструкцію SQL FETCH
. Ключове слово SCROLL повинно бути вказано під час оголошення курсору. За замовчуванням NO SCROLL
, хоча різні мовні зв'язування на кшталт JDBC можуть застосовувати різні значення за замовчуванням.
DECLARE «назва_курсору» «чутливість» SCROLL CURSOR FOR SELECT … FROM …
Цільову позицію для прокручуваного курсору можна вказати відносно (від поточної позиції курсору) чи абсолютно (від початку результатного набору).
FETCH [ NEXT | PRIOR | FIRST | LAST ] FROM «назва_курсору» FETCH ABSOLUTE «n» FROM «назва_курсору» FETCH RELATIVE «n» FROM «назва_курсору»;
Прокручувані курсори потенційно можуть кілька разів отримувати доступ до одного рядка в результатному наборі. Таким чином, модифікації даних (операції вставки, оновлення, видалення) з інших транзакцій можуть упливати на результат. Курсор може бути SENSITIVE або INSENSITIVE для таких модифікацій даних. Чутливий курсор підбирає модифікації даних, що впливають на результатний набір курсору, а нечутливий курсор — ні. Крім того, курсор може бути INSENSITIVE, у цьому випадку СКБД намагається якомога більше застосовувати чутливість.
WITH HOLD
Курсори зазвичай закриваються автоматично наприкінці транзакції, тобто коли відбувається COMMIT або ROLLBACK (або неявне припинення транзакції). Цю поведінку можна змінити, якщо курсор оголошений з використанням виразу WITH HOLD (за замовчуванням WITHOUT HOLD). Утримуваний курсор залишається відкритим після COMMIT і закривається на ROLLBACK (деякі СКБД відхиляються від цієї стандартної поведінки, а також зберігають утримувані курсори відкритими після ROLLBACK).
DECLARE назва_курсору CURSOR WITH HOLD FOR SELECT … FROM …
Коли відбувається COMMIT, утримуваний курсор позиціюється перед наступним рядком. Таким чином, інструкція позиційованого UPDATE чи DELETE буде успішною тільки після того, як операція FETCH відбулася спочатку в транзакції.
Варто зауважити, що JDBC визначає курсори утримуваними за замовчуванням. Це робиться тому, що JDBC також за замовчуванням активує автоматичну фіксацію.
Позиційовані інструкції оновлення та вилучення
Курсори можуть використовуватися не тільки для витягнення даних із СКБД у застосунок, а й для ідентифікації рядка в таблиці для оновлення або видалення. Стандарт SQL:2003 для цієї мети визначає інструкції SQL позиційованого оновлення та видалення. Такі інструкції не використовують регулярні вирази WHERE з предикатами. Натомість курсор ідентифікує рядок. Курсор повинен бути відкритим і вже позиційованим у рядку за допомогою інструкції FETCH
.
UPDATE «назва_таблиці» SET … WHERE CURRENT OF «назва_курсору» DELETE FROM «назва_таблиці» WHERE CURRENT OF «назва_курсору»
Курсор повинен працювати на оновлюваному результатному наборі задля успішного виконання інструкції позиційованого оновлення чи видалення. Інакше СКБД не знатиме, як застосувати зміни даних до базових таблиць, на які посилається курсор.
Курсори в розподілених транзакціях
Використання курсорів у розподілених транзакціях (середовища [en]), які контролюються з використанням монітору транзакцій, нічим не відрізняється від курсорів у нерозподілених транзакціях.
Проте, слід бути уважним при використанні утримуваних курсорів. З'єднання можуть використовуватися різними застосунками. Таким чином, щойно транзакцію було закінчено та зафіксовано, подальша транзакція (що працює в іншому застосунку) може успадковувати наявні утримувані курсори. Тому розробник застосунку повинен знати про цю ситуацію.
Курсори в XQuery
Мова XQuery дозволяє створювати курсори з використанням функції subsequence()
.
Формат:
let $displayed-sequence := subsequence($result, $start, $item-count)
Де $result
— результат початкового XQuery, $start
— номер елементу для запуску, а $item-count
— кількість елементів, для повернення.
Це також можна зробити з використанням предикату:
let $displayed-sequence := $result[$start to $end]
Де $end
— кінцева послідовність.
Повні приклади див. у .
Недоліки курсорів
Наступна інформація може відрізнятися залежно від конкретної системи баз даних.
Витягнення рядка з курсору щоразу може призводити до round-trip мережі. Це використовує набагато більше пропускної здатності мережі, ніж зазвичай потрібно для виконання єдиної інструкції SQL на кшталт DELETE. Повторні англ. round trips мережі можуть сильно сповільнити операції з використанням курсору. Деякі СУБД намагаються зменшити цей ефект, використовуючи блокове витягнення. Блокове витягнення означає, що декілька рядків надсилаються разом від сервера до клієнта. Клієнт зберігає весь блок рядків у локальному буфері й отримує рядки звідти, доки цей буфер не вичерпається.
Курсори виділяють ресурси на сервері, як-от , пакети, процеси та тимчасове зберігання. Наприклад, Microsoft SQL Server реалізує курсори створенням тимчасової таблиці та заповненням її результатним набором запиту. Якщо курсор не закрито належним чином (звільнено), ресурси не будуть звільнені до закриття самого сеансу (з'єднання) SQL. Це витрачання ресурсів на сервері може призвести до зниження продуктивності та відмов.
Приклад
Таблиця EMPLOYEES
SQL> desc EMPLOYEES_DETAILS; Назва Порожнє? Тип ----------------------------------------- -------- -------------------- EMPLOYEE_ID NOT NULL NUMBER(6) FIRST_NAME VARCHAR2(20) LAST_NAME NOT NULL VARCHAR2(25) EMAIL NOT NULL VARCHAR2(30) PHONE_NUMBER VARCHAR2(20) HIRE_DATE NOT NULL DATE JOB_ID NOT NULL VARCHAR2(10) SALARY NUMBER(8,2) COMMISSION_PCT NUMBER(2,2) MANAGER_ID NUMBER(6) DEPARTMENT_ID NUMBER(4)
SAMPLE CURSOR KNOWN AS EE CREATE OR REPLACE PROCEDURE EE AS BEGIN DECLARE v_employeeID EMPLOYEES_DETAILS.EMPLOYEE_ID%TYPE; v_FirstName EMPLOYEES_DETAILS.FIRST_NAME%TYPE; v_LASTName EMPLOYEES_DETAILS.LAST_NAME%TYPE; v_JOB_ID EMPLOYEES_DETAILS.JOB_ID%TYPE := 'IT_PROG'; Cursor c_EMPLOYEES_DETAILS IS SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME FROM EMPLOYEES_DETAILS WHERE JOB_ID = 'v_JOB_ID'; BEGIN OPEN c_EMPLOYEES_DETAILS; LOOP FETCH c_EMPLOYEES_DETAILS INTO v_employeeID, v_FirstName, v_LASTName; DBMS_OUTPUT.put_line(v_employeeID); DBMS_OUTPUT.put_line(v_FirstName); DBMS_OUTPUT.put_line(v_LASTName); EXIT WHEN c_EMPLOYEES_DETAILS%NOTFOUND; END LOOP; CLOSE c_EMPLOYEES_DETAILS; END; END;
Див. також
Джерела
- Date, Christopher J. (2005). Database in Depth. O'Reilly & Associates. ISBN .
- ; (2002). Database Systems. Addison-Wesley. ISBN .
- Elmasri, Ramiz; Navathe, Shamkant B. (1994). Fundamentals of Database Systems. Addison-Wesley. ISBN .
- Matthew, Neil; Stones, Richard (2001). Beginning Databases with PostgreSQL: From Novice to Professional. Apress. ISBN .
{{}}
: Cite має пустий невідомий параметр:|1=
() - Kyte, Thomas. Expert One-On-One: Oracle. Apress. ISBN .
- Loney, Kevin. Oracle Database 10g: The Complete Reference. Oracle Press. ISBN .
Посилання
- Descriptions from Portland Pattern Repository
- . sleepycat.com (англійською) . Архів оригіналу за 15 березня 2006. Процитовано 15 лютого 2019.
- . PostgreSQL (англійською) . Архів оригіналу за 4 березня 2016. Процитовано 15 лютого 2019.
- . dev.mysql.com (англійською) . Архів оригіналу за 13 серпня 2016. Процитовано 15 лютого 2019.
- . Firebird (англійською) . Архів оригіналу за 5 січня 2019. Процитовано 15 лютого 2019.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
U Vikipediyi ye statti pro inshi znachennya cogo termina Kursor V informatici kursor bazi danih keruvalna struktura yaka zabezpechuye obhid zapisiv u bazi danih Kursori polegshuyut podalshu obrobku v poyednanni z obhodom yak ot otrimannya dodavannya ta vidalennya zapisiv bazi danih Harakteristika obhodu kursoru bazi danih nablizhuye kursori do ponyattya iteratora v movah programuvannya Kursori vikoristovuyutsya programistami baz danih dlya obrobki okremih ryadkiv yaki povertayutsya zapitami do sistem bazi danih Kursori dozvolyayut odnochasno manipulyuvati cilimi rezultatnimi naborami U comu scenariyi kursor zabezpechuye poslidovnu obrobku ryadkiv u rezultatnomu nabori U procedurah SQL kursor umozhlivlyuye viznachennya rezultatnogo naboru naboru ryadkiv danih ta vikonuye skladnu logiku na poryadkovij osnovi Vikoristovuyuchi tu samu mehaniku procedura SQL takozh mozhe viznachati rezultatnij nabir i povertati yiyi bezposeredno tomu hto viklikaye proceduru SQL abo kliyentskomu zastosunku Kursor mozhna rozglyadati yak ukazivnik na odin ryadok u nabori Kursor mozhe posilatisya lishe na odin ryadok za raz ale za neobhidnosti mozhe peremishuvatisya do inshih ryadkiv rezultatnogo naboru VikoristannyaDlya vikoristannya kursoriv u procedurah SQL neobhidno zrobiti nastupne Ogolositi kursor yakij viznachaye rezultatnij nabir Vidkriti kursor dlya vstanovlennya rezultatnogo naboru Vityagnuti dani u neobhidni lokalni zminni z kursoru po odnomu ryadku za raz Zakriti kursor pislya zavershennya Dlya roboti z kursorami neobhidno vikoristovuvati nastupni instrukciyi SQL U comu rozdili predstavleno sposobi yakimi standart SQL 2003 viznachaye yak vikoristovuvati kursori v zastosunkah u vbudovanomu SQL Ne vsi priv yazki zastosunkiv dlya relyacijnih sistem baz danih dotrimuyutsya cogo standartu a deyaki napriklad en abo JDBC vikoristovuyut inshij interfejs Programist robit kursor vidomim dlya SKBD za dopomogoyu instrukciyi span class k DECLARE span span class w span span class err span span class w span span class k CURSOR span i priznachennya kursoru obov yazkovogo imeni DECLARE nazva kursoru CURSOR IS SELECT FROM Persh nizh kod mozhe otrimati dostup do danih vin povinen vidkriti kursor za dopomogoyu instrukciyi span class k OPEN span Bezposeredno pislya uspishnogo vidkrittya kursor roztashovuyetsya pered pershim ryadkom rezultatnogo naboru OPEN nazva kursoru Programi poziciyuyut kursori na konkretnomu ryadku v rezultatnomu nabori instrukciyeyu span class k FETCH span Operaciya vityagnennya peredaye dani ryadka do zastosunku FETCH nazva kursoru INTO Shojno zastosunok obrobiv usi dostupni ryadki chi operaciya vityagnennya maye poziciyuvatisya na neisnuyuchomu ryadku por prokruchuvani kursori nizhche SKBD povertaye SQLSTATE 02000 zazvichaj suprovodzhuyetsya SQLCODE 100 dlya poznachennya kincya rezultatnogo naboru Ostannij krok peredbachaye zakrittya kursoru z vikoristannyam instrukciyi span class k CLOSE span CLOSE nazva kursoru Pislya zakrittya kursora programa mozhe znovu jogo vidkriti sho oznachaye pereocinku SKBD togo samogo chi inshogo zapitu ta pobudovu novogo rezultatnogo naboru Prokruchuvani kursoriProgramisti mozhut ogoloshuvati kursori prokruchuvanimi chi ni Prokruchuvanist poznachaye napryamok peremishennya kursoru Z neprokruchuvanimi abo lishe vpered kursorami mozhna span class k FETCH span kozhen ryadok shonajbilshe odin raz a kursor avtomatichno peremishuyetsya do nastupnogo ryadka Pislya vityagnennya ostannogo ryadka ta sprobi nastupnogo vityagnennya kursor rozmishuyetsya pislya ostannogo ryadka sho vidaye nastupnij kod SQLSTATE 02000 SQLCODE 100 Programa mozhe poziciyuvati prokruchuvanij kursor bud de v rezultatnomu nabori vikoristovuyuchi instrukciyu SQL span class k FETCH span Klyuchove slovo SCROLL povinno buti vkazano pid chas ogoloshennya kursoru Za zamovchuvannyam span class k NO span span class w span span class k SCROLL span hocha rizni movni zv yazuvannya na kshtalt JDBC mozhut zastosovuvati rizni znachennya za zamovchuvannyam DECLARE nazva kursoru chutlivist SCROLL CURSOR FOR SELECT FROM Cilovu poziciyu dlya prokruchuvanogo kursoru mozhna vkazati vidnosno vid potochnoyi poziciyi kursoru chi absolyutno vid pochatku rezultatnogo naboru FETCH NEXT PRIOR FIRST LAST FROM nazva kursoru FETCH ABSOLUTE n FROM nazva kursoru FETCH RELATIVE n FROM nazva kursoru Prokruchuvani kursori potencijno mozhut kilka raziv otrimuvati dostup do odnogo ryadka v rezultatnomu nabori Takim chinom modifikaciyi danih operaciyi vstavki onovlennya vidalennya z inshih tranzakcij mozhut uplivati na rezultat Kursor mozhe buti SENSITIVE abo INSENSITIVE dlya takih modifikacij danih Chutlivij kursor pidbiraye modifikaciyi danih sho vplivayut na rezultatnij nabir kursoru a nechutlivij kursor ni Krim togo kursor mozhe buti INSENSITIVE u comu vipadku SKBD namagayetsya yakomoga bilshe zastosovuvati chutlivist WITH HOLDKursori zazvichaj zakrivayutsya avtomatichno naprikinci tranzakciyi tobto koli vidbuvayetsya COMMIT abo ROLLBACK abo neyavne pripinennya tranzakciyi Cyu povedinku mozhna zminiti yaksho kursor ogoloshenij z vikoristannyam virazu WITH HOLD za zamovchuvannyam WITHOUT HOLD Utrimuvanij kursor zalishayetsya vidkritim pislya COMMIT i zakrivayetsya na ROLLBACK deyaki SKBD vidhilyayutsya vid ciyeyi standartnoyi povedinki a takozh zberigayut utrimuvani kursori vidkritimi pislya ROLLBACK DECLARE nazva kursoru CURSOR WITH HOLD FOR SELECT FROM Koli vidbuvayetsya COMMIT utrimuvanij kursor poziciyuyetsya pered nastupnim ryadkom Takim chinom instrukciya pozicijovanogo UPDATE chi DELETE bude uspishnoyu tilki pislya togo yak operaciya FETCH vidbulasya spochatku v tranzakciyi Varto zauvazhiti sho JDBC viznachaye kursori utrimuvanimi za zamovchuvannyam Ce robitsya tomu sho JDBC takozh za zamovchuvannyam aktivuye avtomatichnu fiksaciyu Pozicijovani instrukciyi onovlennya ta viluchennyaKursori mozhut vikoristovuvatisya ne tilki dlya vityagnennya danih iz SKBD u zastosunok a j dlya identifikaciyi ryadka v tablici dlya onovlennya abo vidalennya Standart SQL 2003 dlya ciyeyi meti viznachaye instrukciyi SQL pozicijovanogo onovlennya ta vidalennya Taki instrukciyi ne vikoristovuyut regulyarni virazi WHERE z predikatami Natomist kursor identifikuye ryadok Kursor povinen buti vidkritim i vzhe pozicijovanim u ryadku za dopomogoyu instrukciyi span class k FETCH span UPDATE nazva tablici SET WHERE CURRENT OF nazva kursoru DELETE FROM nazva tablici WHERE CURRENT OF nazva kursoru Kursor povinen pracyuvati na onovlyuvanomu rezultatnomu nabori zadlya uspishnogo vikonannya instrukciyi pozicijovanogo onovlennya chi vidalennya Inakshe SKBD ne znatime yak zastosuvati zmini danih do bazovih tablic na yaki posilayetsya kursor Kursori v rozpodilenih tranzakciyahVikoristannya kursoriv u rozpodilenih tranzakciyah seredovisha en yaki kontrolyuyutsya z vikoristannyam monitoru tranzakcij nichim ne vidriznyayetsya vid kursoriv u nerozpodilenih tranzakciyah Prote slid buti uvazhnim pri vikoristanni utrimuvanih kursoriv Z yednannya mozhut vikoristovuvatisya riznimi zastosunkami Takim chinom shojno tranzakciyu bulo zakincheno ta zafiksovano podalsha tranzakciya sho pracyuye v inshomu zastosunku mozhe uspadkovuvati nayavni utrimuvani kursori Tomu rozrobnik zastosunku povinen znati pro cyu situaciyu Kursori v XQueryMova XQuery dozvolyaye stvoryuvati kursori z vikoristannyam funkciyi span class nf subsequence span span class p span Format let displayed sequence subsequence result start item count De span class nv span span class n result span rezultat pochatkovogo XQuery span class nv span span class n start span nomer elementu dlya zapusku a span class nv span span class n item count span kilkist elementiv dlya povernennya Ce takozh mozhna zrobiti z vikoristannyam predikatu let displayed sequence result start to end De span class nv span span class n end span kinceva poslidovnist Povni prikladi div u Nedoliki kursorivNastupna informaciya mozhe vidriznyatisya zalezhno vid konkretnoyi sistemi baz danih Vityagnennya ryadka z kursoru shorazu mozhe prizvoditi do round trip merezhi Ce vikoristovuye nabagato bilshe propusknoyi zdatnosti merezhi nizh zazvichaj potribno dlya vikonannya yedinoyi instrukciyi SQL na kshtalt DELETE Povtorni angl round trips merezhi mozhut silno spovilniti operaciyi z vikoristannyam kursoru Deyaki SUBD namagayutsya zmenshiti cej efekt vikoristovuyuchi blokove vityagnennya Blokove vityagnennya oznachaye sho dekilka ryadkiv nadsilayutsya razom vid servera do kliyenta Kliyent zberigaye ves blok ryadkiv u lokalnomu buferi j otrimuye ryadki zvidti doki cej bufer ne vicherpayetsya Kursori vidilyayut resursi na serveri yak ot paketi procesi ta timchasove zberigannya Napriklad Microsoft SQL Server realizuye kursori stvorennyam timchasovoyi tablici ta zapovnennyam yiyi rezultatnim naborom zapitu Yaksho kursor ne zakrito nalezhnim chinom zvilneno resursi ne budut zvilneni do zakrittya samogo seansu z yednannya SQL Ce vitrachannya resursiv na serveri mozhe prizvesti do znizhennya produktivnosti ta vidmov PrikladTablicya EMPLOYEES SQL gt desc EMPLOYEES DETAILS Nazva Porozhnye Tip EMPLOYEE ID NOT NULL NUMBER 6 FIRST NAME VARCHAR2 20 LAST NAME NOT NULL VARCHAR2 25 EMAIL NOT NULL VARCHAR2 30 PHONE NUMBER VARCHAR2 20 HIRE DATE NOT NULL DATE JOB ID NOT NULL VARCHAR2 10 SALARY NUMBER 8 2 COMMISSION PCT NUMBER 2 2 MANAGER ID NUMBER 6 DEPARTMENT ID NUMBER 4 SAMPLE CURSOR KNOWN AS EE CREATE OR REPLACE PROCEDURE EE AS BEGIN DECLARE v employeeID EMPLOYEES DETAILS EMPLOYEE ID TYPE v FirstName EMPLOYEES DETAILS FIRST NAME TYPE v LASTName EMPLOYEES DETAILS LAST NAME TYPE v JOB ID EMPLOYEES DETAILS JOB ID TYPE IT PROG Cursor c EMPLOYEES DETAILS IS SELECT EMPLOYEE ID FIRST NAME LAST NAME FROM EMPLOYEES DETAILS WHERE JOB ID v JOB ID BEGIN OPEN c EMPLOYEES DETAILS LOOP FETCH c EMPLOYEES DETAILS INTO v employeeID v FirstName v LASTName DBMS OUTPUT put line v employeeID DBMS OUTPUT put line v FirstName DBMS OUTPUT put line v LASTName EXIT WHEN c EMPLOYEES DETAILS NOTFOUND END LOOP CLOSE c EMPLOYEES DETAILS END END Div takozhIteratorDzherelaDate Christopher J 2005 Database in Depth O Reilly amp Associates ISBN 0 596 10012 4 2002 Database Systems Addison Wesley ISBN 0 321 21025 5 Elmasri Ramiz Navathe Shamkant B 1994 Fundamentals of Database Systems Addison Wesley ISBN 0 201 54263 3 Matthew Neil Stones Richard 2001 Beginning Databases with PostgreSQL From Novice to Professional Apress ISBN 1 59059 478 9 a href wiki D0 A8 D0 B0 D0 B1 D0 BB D0 BE D0 BD Cite book title Shablon Cite book cite book a Cite maye pustij nevidomij parametr 1 dovidka Kyte Thomas Expert One On One Oracle Apress ISBN 1 59059 525 4 Loney Kevin Oracle Database 10g The Complete Reference Oracle Press ISBN 0 07 225351 7 PosilannyaDescriptions from Portland Pattern Repository sleepycat com anglijskoyu Arhiv originalu za 15 bereznya 2006 Procitovano 15 lyutogo 2019 PostgreSQL anglijskoyu Arhiv originalu za 4 bereznya 2016 Procitovano 15 lyutogo 2019 dev mysql com anglijskoyu Arhiv originalu za 13 serpnya 2016 Procitovano 15 lyutogo 2019 Firebird anglijskoyu Arhiv originalu za 5 sichnya 2019 Procitovano 15 lyutogo 2019