7605

Курсори SQL

Лекция

Информатика, кибернетика и программирование

Курсори SQL Курсор дозволяє включити у вибірку тільки деякі з отриманих записів. При правильному використанні курсори підвищують ефективність роботи з наборами записів. Курсори виконуються тільки в транзакційних блоках...

Украинкский

2013-01-26

132 KB

1 чел.

PAGE  2

Курсори SQL

Курсор дозволяє включити у вибірку тільки деякі з отриманих записів. При правильному використанні курсори підвищують ефективність роботи з наборами записів. Курсори виконуються тільки в транзакційних блоках.

        Курсор мовою SQL являє собою вказівник на підсумковий набір даних, виданих командою SELECT. Його використання надає такі переваги:

  •  економія оперативної пам’яті за рахунок зберігання тільки потрібних даних (вибірки). Це особливо вигідно під час використання громіздких таблиць;
  •  зменшення навантаження на зовнішні носії пам’яті при багаторазовому читанні вибірки, включаючи читання одних і тих же даних. Це дозволяє зменшити кількість звертань до зовнішньої пам’яті при багаторазовому використанні одних і тих же даних. Зменшується навантаження й на мережу в багатокористувацьких системах;
  •  збільшення швидкості звертання до даних за рахунок уникнення блокування.

        Оголошення курсора. Курсор може бути оголошений тільки в складі транзакційного блока, який починається з команди BEGIN. В SQL команда оголошення курсора одночасно виконує його відкриття. Комана оголошення має такий вигляд:

        DECLARE курсор [ BINARY ] [ INSENSITIVE ] [ SCROLL ]

        CURSOR FOR запит

        [ FOR { READ ONLY | UPDATE [ OF поле [, ...]]}]

        Тут:

        курсор – ім’я створюваного курсора;

        BINARY означає, що вихідні дані повинні повертатися в двійковому форматі замість стандартного ASCII-коду;

        INSENSITIVE забезпечує незалежність даних, повернених курсором, від інших курсорів або підключень, тобто дані, отримані з використанням курсора, не схильні до змін з боку інших процессів (і інших курсорів);

        SCROLL забезпечує прокрутку даних, тобто дозволяє багаторазове читання записів;

        CURSOR FOR запит – запит, якого підсумковий набір стає доступним через курсор;

        READ ONLY дозволяє використовувати курсор тільки для читання даних. У PostgreSQL цей режим установлений за замовчуванням.

        UPDATE – курсор використовується для редагування таблиць;

        OF поле – список імен полів, що оновлюються курсором.  

        PostgreSQL не вимагає окремого відкриття курсорів, курсори відкриваються автоматично під час оголошення.  

        У поданому нижче прикладі створено транзакцію командою BEGIN і відкрито курсор gazprovid, який буде містити всі записи і всі поля таблиці gazpr.

        BEGIN;

        DECLARE gazprovid CURSOR  FOR SELECT * FROM gazpr;

        Вибірка записів з  курсора проводиться командою FETCH, яка має такий вигляд:

        FETCH [ FORWARD | BACKWARD | RELATIVE ] [ число | ALL | NEXT | PRIOR ]

                { IN | FROM } курсор

        У цьому оголошенні курсорімя курсора, з якого відбувається вибірка записів. Курсор завжди вказує на поточну позицію підсумкового набору, а у вибірці можуть брати участь записи, що знаходяться до або після неї. Напрям вибірки визначається ключовими словами FORWARD і BACKWARD, за замовчуванням використовується пряма вибірка (FORWARD). Слово RELATIVE число означає зміщення на задану кількість записів відносно поточної позиції курсора. У команді замість RELATIVE може використовуватися ключове слово ABSOLUTE – абсолютне позиціонування, тобто переміщення до заданого запису.

        За ключовим словом, що ідентифікує напрям, можна вказувати кількість записів. Допускається вказання конкретного числа записів (у вигляді цілочислової константи) або одного з декількох ключових слів. Ключове слово ALL означає, що команда повертає всі записи, починаючи з поточної позиції курсора, NEXT (використовується за замовчуванням) – наступний запис від поточної позиції – PRIOR запис, який знаходиться перед поточним.

        Ключові слова IN і FROM еквівалентні, з них  команда повинна мати якесь одне.

        Нижче у прикладі вибираються перші чотири записи підсумкового набору, на який посилається курсор gazprovid. Напрямок не вказаний, тому за замовчанням використовується ключове слово FORWARD. Далі команда FETCH з ключовим словом NEXT вибирає п’ятий запис, після чого вона з ключовим словом PRIOR знову повертається до четвертого запису.

        FETCH 4 FROM gazprovid;

        FETCH NEXT FROM gazprovid;

        FETCH PRIOR FROM gazprovid;

 

        Число записів може бути як додатнім, так і відємним. При додатньому значенні відлік ведеться в напрямку, заданому відповідним параметром (якщо параметр не вказаний, за замовчуванням використовується параметр FORWARD).

        При від’ємній кількості записів відлік ведеться в напрямку, протележному заданому. Наприклад, конструкція FORWARD -5 еквівалентна конструкції BACKWARD 5. Якщо кількість запрошених записів перевищує кількість записів у базі, команда FETCH вибирає всі існуючі записи у вказаному напрямку.

        У подальших прикладах виготовляється курсор gazprovid, який повертає дані з таблиці gazpr. Наступна команда вибирає перші два його записи:

        BEGIN;

        DECLARE gazprovid CURSOR FOR SELECT kod_g, naz_g FROM gazpr;

        FETCH FORWARD 2 IN gazprovid;

        У нижченаведеному прикладі конструкція BACKWARD -2 також проводить вибірку двох записів у прямому напрямку:

        FETCH BACKWARD - 2 IN gazprovid;

        А ця команда демонструє вибірку в зворотному напрямку через курсор gazprovid:

        FETCH BACKWARD 3 IN gazprovid;

        FETCH prior IN funccursor; --на 1

        FETCH next IN funccursor; --на 1

        FETCH 2 IN funccursor; -- те ж, що BACKWARD 2

        Переміщення курсора до заданого запису виконується командою MOVE:

        MOVE[FORWARD|BACKWARD|RELATIVE][число|ALL|NEXT|PRIOR]{IN|FROM} курсор

        Як видно з цього оголошення, синтаксис команди MOVE дуже близький до синтаксису команди FETCH. Втім, команда MOVE ніяких записів не повертає і лише переміщає поточну позицію курсора. Зміщення задається цілочисловою константою або ключовими словами ALL (переміщення в заданому напрямку на максимально можливу відстань), NEXT або PRIOR. Нижче у прикладі поточна позиція курсора переміщується на 3 записи вперед.

        Спроба вибірки нуля записів із ключовим словом RELATIVE спричиняє помилку ERROR: FETCH/RELATIVE at current position is not supported. Це пов’язано з тим, що відповідно до стандарту SQL92 команда FETCH RELATIVE FROM курсор повинна забезпечувати повторну вибірку запису в поточній позиції курсора. У деяких версіях PostgreSQL цей синтаксис не підтримується. Без ключового слова RELATIVE число 0 інтерпретується як запит на вибірку всіх записів. Але з ключовим словом RELATIVE PostgreSQL припускає, що ви намагаєтеся використовувати синтаксис SQL92, і замість того, щоб повернути всі записи, виводить повідомлення про помилку. Наведемо приклад переміщення поточної позиції курсора:

        MOVE FORWARD 3 IN gazoprovid;

        Закриття курсора забезпечується командою CLOSE. Курсор також автоматично закривається при виході з транзакційного блоку, в якому він знаходиться, при фіксації транзакції командою COMMIT або при її відкоті командою ROLLBACK.

Команда CLOSE має такий вигляд (курсорім’я курсора, що закривається):

        CLOSE курсор

        У нижченаведеному прикладі курсор gazoprovid закривається і звільняє займану ним пам’ять, внаслідок після чого дані курсора стають недоступними.

 

        CLOSE gazoprovid;

        COMMIT;

        Команда CLOSE закриває відкритий курсор і звільняє всі використовувані ним ресурси. Коли потреба в курсорі відпадає, його слід закривати. Після закриття курсора подальші операції з ним стають неможливими.  

  1.  Повернені курсори (PostgreSQL 8.3, Pl/pgSQL– процедурна мова SQL)

        Функції Pl/pgSQL можуть повертати курсори. Їх доцільно застосувати, якщо маємо порівняно великі команди SQL, тоді команда виклику функції буде коротшою.   

          Ім’я порталу, який використовується для курсора, може бути задане програмістом або генерується автоматично. Для вказання назви порталу слід присвоїти рядок refcur змінній перед його відкриттям. У прикладі нижче показаний один із способів виклику курсора:

CREATE OR REPLACE FUNCTION p_kurs(refcursor, integer) RETURNS refcursor AS

$$

DECLARE

kod ALIAS FOR $2;

BEGIN

OPEN $1 FOR SELECT * FROM gazpr WHERE kod_g > kod;

RETURN $1;

END;

$$

 LANGUAGE plpgsql;

BEGIN;

SELECT p_kurs('funccursor',2);

FETCH ALL IN funccursor; -- решта від поточного

MOVE prior FROM funccursor;  

MOVE first FROM funccursor; --на 1-й запис

MOVE prior FROM funccursor;-- на один запис назад (до переду)


        Можлива автоматична генерація імені курсора та повернення функцією декількох курсорів


        39.7. Курсори (Beta 9.0)


        Замість виконання цілого запиту за одним разом, можна створити курсор, який інкапсулює запит, а потім прочитати його декілька рядків. Цікавою є можливість використання функції, яка забезпечує ефективний спосіб повернення великих наборів рядків з функцій.

        39.7.1. Оголошення курсорної змінної

        Всі доступи до курсора в Pl/pgSQL проходять через курсорні змінні, які мають спеціальний тип даних refcursor. Один із способів створення курсорної змінної є просто її оголошення як змінної типу refcursor. Інший спосіб – оголошення курсора, яке має такий синтаксис:


        ім’я  [[ NO ] SCROLL ] CURSOR [( аргументи ) ] FOR запит;


         (FOR можна замінити на IS для сумісності з Oracle.) Якщо SCROLL вказаний, то курсор буде здатний до прокрутки назад; якщо вказано NO SCROLL, то зворотна вибірка буде відхилена, якщо ні одна специфікація не вказана, то чи вибірка назад буде дозволена залежить від запиту. Аргументи, перелік яких дається через кому, визначають імена, які повинні бути замінені значеннями параметрів запиту. Фактичні значення для заміни цих імен буде уточнено після відкриття курсора. Ось деякі приклади:


        DECLARE 

        curs1 REFCURSOR;

        curs2 CURSOR FOR  SELECT * FROM джерело;

        curs3 CURSOR (ключ INTEGER) IS SELECT *  FROM джерело WHERE поле = ключ;


        
Всі ці три змінні мають тип refcursor, але перша може бути використана з будь-яким запитом, друга має зв’язаний з нею запит і, нарешті, – зв’язаний з нею параметризований запит (ключ може бути замінений цілим значенням параметра при відкритті курсора.) Змінна curs1 називається незвязаною, оскільки вона не привязана ні до якого конкретного запиту.


        39.7.2. Відкриття курсора 


        Перед використанням курсора для отримання рядків його необхідно відкрити. (Це еквівалентно дії команди SQL DECLARE CURSOR.) Pl/pgSQL має три форми відкриття, дві з яких незв’язані з курсорними змінними, а третя використовує зв’язану змінну курсора.      

        Примітка: змінні, пов’язані з курсором, можуть також використовуватися без явного відкриття курсора, через оператор FOR, описаний у розділі 39.7.4.


        
39.7.2.1. Відкритя для запиту (Можливе також відкриття для виконання – EXECUTE)


       
 OPEN unbound_cursorvar [[ NO ] SCROLL ] FOR запит;


        
Змінну курсора буде відкрито і з урахуванням зазначеного запиту виконано. Курсор не може бути відкритим під час оголошення. Він повинен бути оголошений як незв’язана змінна курсора (тобто, як проста змінна refcursor). Запит повинен бути SELECT, чи щось інше, що повертає рядки (наприклад, EXPLAIN). Запит PL/pgSQL ттакий же, як і інші команди SQL: в PL/pgSQL імена змінних замінюються, і план запиту кешується для можливого повторного використання. Варіанти SCROLL і NO SCROLL мають те ж значення, що й для звязаного курсора. Наприклад:

        OPEN curs1 FOR SELECT * FROM foo WHERE key = mykey;


        39.7.2.3. Відкриття з’вязаного курсора


        OPEN bound_cursorvar [(argument_values)];


        Ця форма використовується для відкриття курсора, якого запит був звязаний зі змінною під час оголошення. Курсор не може бути відкритий під час оголошення. Список фактичних параметрів – значення аргументів повинно задаватися тільки тоді, коли курсор був оголошений для прийому аргументів. Ці значення будуть замінені у запиті. План запиту для звязаного курсора завжди вважається кешованим, у цьому випадку немає еквівалента відкриття для EXECUTE. Тут немає SCROLL і NO SCROLL, поведінка курсора за замовчуванням визначена як прокручування. Заміна змінної робиться як у запиті звязаного курсора, є два способи передачі значень у курсор: або з явного аргумента відкриття, чи неявно, посилаючись на змінну PL/pgSQL у запиті (варіант INTO). Однак, тільки змінні, оголошені перед звязаним курсором буде замінено. В будь-якому випадку значення для передачі визначається у момент відкриття. Приклади:


        OPEN curs2;

        OPEN curs3 (42);


        39.7.3. Використання курсорів


        Як тільки курсор відкритий, його даними можна маніпулювати відповідно до зробленого опису. Ці маніпуляції не повинні відбуватися в тій же функції, що відкритий курсор. Можна повернути значення refcursor з функції, і нехай викликає працювати на курсор. (Внутрішньо, refcursor значення просто рядок імя так званого порталу, який містить активний запит для курсора. Це імя може бути передано з усього, віднесеного до інших змінних refcursor, не порушуючи порталу.) Всі портали неявно закриваються наприкінці запиту, тому значення refcursor може використовуватися тільки до кінця операції.


        39.7.3.1. FETCH


       
 FETCH [напрямок {FROM | IN}] курсор INTO  ціль;

 
     
  FETCH витягує наступний рядок з курсора в ціль, яка може бути рядком змінних, записом або розділеним комами списком простих змінних, так же як і в SELECT INTO. Як і в SELECT INTO, спеціальна змінна може бути перевірена на наявність – FOUND. Напрямок може бути будь-яким із варіантів дозволених командою SQL FETCH, крім тих, які можуть видавати більше одного рядка, а саме: NEXT, PRIOR, FIRST, LAST, ABSOLUTE count, RELATIVE count, FORWARD, або BACKWARD. Напрямок NEXT опускається. Приклади:

        FETCH   curs1    INTO   rowvar;

        FETCH   curs2    INTO   foo,   bar,   baz;

        FETCH   LAST   FROM   curs3    INTO   x,  y;

        FETCH   RELATIVE  -2  FROM   curs4   INTO   x;

        39.7.3.2. MOVE 

 

        MOVE [напрямок {FROM | IN}] курсор;

        MOVE переміщує курсор без отримання будь-яких даних. MOVE працює так же, як у команді FETCH, за винятком того, що курсор не повертає рядок. Як і в SELECT INTO та FETCH, відбувається перевірка чи існує рядок, на який потрібно перейти. Напрямок може бути будь-яким із дозволених у команді SQL FETCH, а саме: NEXT, PRIOR, FIRST, LAST, ABSOLUTE count, RELATIVE count, ALL, FORWARD [count | ALL], або BACKWARD [count | ALL]. Напрямок NEXT опускається. Приклади:


        MOVE curs1;

        MOVE LAST FROM curs3;

        MOVE RELATIVE -2 FROM curs4;

        MOVE FORWARD 2 FROM curs4;

        39.7.3.3. UPDATE / DELETE WHERE CURRENT OF


        UPDATE таблиця SET ... WHERE CURRENT OF курсор;

        DELETE FROM таблиця WHERE CURRENT OF курсор;


       Коли курсор знаходиться на рядку таблиці, її рядки можуть бути оновлені або вилучені за допомогою курсора для ідентифікації рядка. Існують обмеження на те, що запит курсора може бути (зокрема, не угруповання), і це найкраще використання курсора для внесення до неї змін. Для отримання додаткової інформації див сторінку DECLARE посилання. Наприклад:


        UPDATE foo SET dataval = myval WHERE CURRENT OF curs1;


        39.7.3.4. Закритя курсора

 
        CLOSE курсор;


        CLOSE закриває портал основного відкритого курсора. Це може бути використано для звільнення ресурсів чи для звільнення курсорної змінної перш, ніж його буде відкрито знову. Наприклад:


        CLOSE curs1;

        Zvit з курсором:

CREATE OR REPLACE FUNCTION zvit(integer)

RETURNS text AS

$$

DECLARE

name_p pidpr.naz_p %TYPE; kilkist oblik.kilk %TYPE; name_g gazpr.naz_g %TYPE;

den INTEGER; mis INTEGER; rik INTEGER; ms CHARACTER(9) ARRAY[12];

slovo TEXT; kod ALIAS FOR $1;

kursor CURSOR FOR   

SELECT pidpr.naz_p,SUM(oblik.kilk) FROM pidpr

INNER JOIN oblik ON pidpr.kod_p = oblik.kod_p

WHERE oblik.kod_g=kod

AND EXTRACT(YEAR FROM CURRENT_DATE)=EXTRACT(YEAR FROM OBLIK.DATA)

GROUP BY pidpr.naz_p

ORDER BY pidpr.naz_p;

BEGIN

den:=EXTRACT(DAY FROM CURRENT_DATE);

mis:=EXTRACT(MONTH FROM CURRENT_DATE);

rik:=EXTRACT(YEAR FROM CURRENT_DATE);

ms[1]:='січня';ms[2]:='лютого';ms[3]:='березня';ms[4]:='квітня';ms[5]:='травня';ms[6]:='червня';

ms[7]:='липня';ms[8]:='серпня';ms[9]:='вересня';ms[10]:='жовтня';ms[11]:='листопада';ms[12]:='грудня';

SELECT INTO name_g naz_g FROM gazpr WHERE kod_g = kod;

slovo:='                                         Звіт'||E'\n';

slovo:=slovo ||'про кількість транспортованого газу по газопроводу '||name_g||E'\n';

slovo:=slovo ||'станом на '||TO_CHAR(den,'99')||' '||ms[mis]||' '|| TO_CHAR(rik,'9999')||E'\n\n';

slovo:=slovo ||'Підприємство                  Кількість'||E'\n';

slovo:=slovo ||'-----------------------------------------------'||E'\n';

OPEN kursor;

LOOP

FETCH kursor INTO name_p, kilkist;

exit when not found;

slovo:=slovo||name_p||'           '||TO_CHAR(kilkist,'99.9')||E'\n';

END LOOP;

CLOSE kursor;

RETURN slovo;

END;

$$

LANGUAGE plpgsql;

select zvit(2);

                                                      Звіт

про кількість транспортованого газу по газопроводу Ямпіль-Ужгород-держкордон

станом на  12 квітня  2011

Підприємство                  Кількість

-----------------------------------------------

Експорттрансгаз             5.0

Прикарпаттрансгаз         2.0

        Таблиця gazpr (газопроводи):

1   Україна                                         1   1400

2   Ямпіль-Ужгород-держкордон     2   1400

3   Острогожськ-Гадяч                     2   1000

4   Єлецьк-Орел                               7   1200

5   Єлецьк-Десна-Кривий Ріг           5   1600

        Таблиця pidpr (підприємства):

1  Харківтрансгаз              Харків        

2  Прикарпаттрансгаз       Івано-Франківськ         

3  Київтрансгаз                  Київ                    

4  Львівтрансгаз                Львів          

5  Експорттрансгаз           Ужгород    

        Таблиця оblik (облік):

2    2    2005-04-12    2

2    2    2011-04-12    2

2    5    2011-02-11    1

3    5    2011-09-10    3

2    5    2011-07-01    4

        Zvit_cykl без курсора:

CREATE OR REPLACE FUNCTION zvit_cykl(integer)

RETURNS text AS

$$

DECLARE

zapysp pidpr %ROWTYPE; zapyso oblik %ROWTYPE; zapysg gazpr %ROWTYPE;

name_g gazpr.naz_g %TYPE; kod ALIAS FOR $1;

den INTEGER; mis INTEGER; rik INTEGER; ms CHARACTER(9) ARRAY[12];

slovo TEXT; s REAL; b BOOL;

BEGIN

den:=EXTRACT(DAY FROM CURRENT_DATE);

mis:=EXTRACT(MONTH FROM CURRENT_DATE);

rik:=EXTRACT(YEAR FROM CURRENT_DATE);

ms[1]:='січня'; ms[2]:='лютого'; ms[3]:='березня'; ms[4]:='квітня';

ms[5]:='травня'; ms[6]:='червня'; ms[7]:='липня'; ms[8]:='серпня';

ms[9]:='вересня'; ms[10]:='жовтня'; ms[11]:='листопада'; ms[12]:='грудня';

SELECT INTO name_g naz_g FROM gazpr WHERE kod_g = kod;

slovo:='                                         Звіт'||E'\n';

slovo:=slovo ||'про кількість транспортованого газу по газопроводу '||name_g||E'\n';

slovo:=slovo ||'станом на '||TO_CHAR(den,'99')||' '||ms[mis]||' '|| TO_CHAR(rik, '9999')||E'\n\n';

slovo:=slovo ||'Підприємство                  Кількість'||E'\n';

slovo:=slovo ||'-----------------------------------------------'||E'\n';

FOR zapysp IN SELECT * FROM pidpr ORDER BY naz_p LOOP

s:=0;

FOR zapyso IN SELECT * FROM oblik LOOP

b:=zapyso.kod_g=kod;

b:=b AND zapyso.kod_p=zapysp.kod_p;

b:=b AND rik=EXTRACT(YEAR FROM zapyso.data);

IF b THEN s:=s+zapyso.kilk; END IF;

END LOOP;

IF s>0 THEN slovo:=slovo||zapysp.naz_p||'           '||TO_CHAR(s,'99.9')||E'\n';

END IF;

END LOOP;

RETURN slovo;

END;

$$

LANGUAGE plpgsql;

select zvit_cykl(2);

                                                      Звіт

про кількість транспортованого газу по газопроводу Ямпіль-Ужгород-держкордон

станом на  12 квітня  2011

Підприємство                  Кількість

-----------------------------------------------

Експорттрансгаз             5.0

Прикарпаттрансгаз         2.0


 

А также другие работы, которые могут Вас заинтересовать

14603. Разработка многотабличных баз данных 245.5 KB
  Практическая работа № 21 Тема: Разработка многотабличных баз данных Цели работы: научиться удалять таблицы; научиться создавать таблицы базы данных в режиме таблицы; научиться создавать самостоятельно ключевое поле; научиться создавать формы для ввод...
14604. Обработка графических объектов (растровая и векторная графика) 84.5 KB
  Практическая работа № 2223 Тема: Обработка графических объектов растровая и векторная графика. Цель: научиться создавать графические изображения и их редактировать. Программное обеспечение: Графический редактор Paint. Теоретическая часть: Компьютерн
14605. Разработка презентаций 413.5 KB
  Практическая работа № 24 Тема: Разработка презентаций. Цель: научится создавать новую презентацию средствами PowerPoint форматировать и редактировать слайды. Ход работы Создать электронную иллюстрацию выступления касающегося структуры построения курса лекций п
14606. Создание эффектов и демонстрация презентации 89 KB
  Практическая работа № 25 Тема: Создание эффектов и демонстрация презентации Цель: научится осуществлять демонстрацию слайдфильма настройку эффектов анимации объектов и переходов слайдов. Ход работы Откройте созданный вами ранее файл Презентация 1. ...
14607. Поиск информации в Интернете 49 KB
  Практическая работа № 26 Тема: Поиск информации в Интернете. Цель: знать и уметь пользоваться правилами поиска информации в глобальной сети Интернет уметь работать с Webстраницами. Программное обеспечение: программа – браузер Internet Explorer. Теоретическая ча
14608. Работа со служебными приложениями (архивация данных, дефрагментация диска), антивирусной программой 284 KB
  Практическая работа № 29 Тема: Работа со служебными приложениями архивация данных дефрагментация диска антивирусной программой Ход работы: 1. Дефрагментация диска С Выберите программу для дефрагментации диска Пуск Стандартные Служебные Дефраг
14609. Засоби створення сховищ даних 137.96 KB
  Доповідь з дисципліни: Технології сховищ даних на тему: Засоби створення сховищ даних Створення сховищ даних. Технології OLAP та Data Mining Структура сховища даних та оптимізація його обсягів Методи інтелектуального аналізу інформації час...
14610. Проектування логічної структури сховища даних з архітектурою Корпоративна фабрика 335.55 KB
  Лабораторна робота № 1 з дисципліни: Технології сховищ даних на тему: Проектування логічної структури сховища даних з архітектурою Корпоративна фабрика Мета роботи: Вивчення порядку методів та засобів проектування і побудови сховища даних з ко
14611. Проектування логічної структури сховища даних з архітектурою шини 242.47 KB
  8 Лабораторна робота № 2 з дисципліни: Технології сховищ даних на тему: Проектування логічної структури сховища даних з архітектурою шини Мета роботи: Вивчення порядку методів та засобів проектування і побудови сховища даних з архітекту...