Два критерію професіоналізму програмування Oracle: вживання посилання на курсор у запиті SQL, Інтеграція додатків і даних, Бази даних, статті

попередня стаття серії

… Народила цариця в ніч
Не те сина, не то дочка;
Чи не мишеня, не жабу,
А невідомий тваринку.
А.С. Пушкін, “Казка про царя Салтана”


Зміст



Анотація


Розглядаються можливості використання посилань на курсор в пропозиції SQL в Oracle.

Посилання на курсор в реченні SELECT


Посилання на курсор можуть використовуватися не тільки в програмі, але і в пропозиції SQL. Це забезпечується зазначенням у фразі SELECT пропозиції SELECT вираження CURSOR для формування стовпця результату. Якщо ми спробуємо зробити це в SQL * Plus, результат здасться досить несподівана:
















SQL> SELECT
2 dname
3 , CURSOR ( SELECT ename FROM emp WHERE emp.deptno = dept.deptno ) 
4 FROM dept;
 
























































DNAME
CURSOR(SELECTENAMEFR

ACCOUNTING
CURSOR STATEMENT : 2
 
CURSOR STATEMENT : 2
 
ENAME 
CLARK 
KING 
MILLER 
 
RESEARCH
CURSOR STATEMENT : 2
 
CURSOR STATEMENT : 2
 
ENAME
SMITH 
JONES 
SCOTT 
ADAMS 
FORD 
 
SALES
CURSOR STATEMENT : 2
 
… … … …

На ділі сталося ось що: пропозиція SELECT … FROM dept повернуло у другому стовпці результату кожній своїй рядка посилання на курсор, сформований динамічно пропозицією всередині CURSOR (…). Програма SQL * Plus проінтерпретував це посилання, перебравши рядки, немов як це робили ми в прикладах попередньої статті, і видала рядка на екран. У результаті ми побачили на екрані перелік чотирьох рядків-відділів, і для кожного відділу – перелік співробітників.

Форма видачі цікава, але, здається, практично даремна. Так навіщо ж потрібно вираз CURSOR в реченні SELECT? Щоб відповісти на це питання, знову звернемося до програмування.

Програмна обробка


Розглянемо наступний приклад блоку PL / SQL, де використовується (а) звичайний курсор для SELECT і (б) курсорні вираз всередині:

SET SERVEROUTPUT ON

DECLARE
CURSOR main_cur IS
SELECT
   dname
,  CURSOR ( SELECT ename FROM emp WHERE emp.deptno = dept.deptno )
FROM dept
;
deptname dept.dname%TYPE;
empname emp.ename%TYPE;
inner_cur SYS_REFCURSOR;
 
BEGIN
OPEN main_cur;
LOOP

FETCH main_cur INTO deptname, inner_cur;
EXIT WHEN main_cur%NOTFOUND;
dbms_output.put_line ( “-” // deptname );
LOOP

FETCH inner_cur INTO empname;
EXIT WHEN inner_cur%NOTFOUND;
dbms_output.put_line( empname );

END LOOP;
CLOSE inner_cur;

END LOOP;
CLOSE main_cur;
END;
/

В результаті такої організації запиту ми не просто видали список відділів і їх співробітників, але змогли обробити кожен раз виникає перелік співробітників програмно. Якби не було вираження CURSOR, такого роду програмну обробку можна було б організувати, тільки завівши в програмі два курсора, а не один (а при використанні в одному реченні SELECT відразу декількох курсорних виразів, можливо вкладених, – більш ніж два).

Більш того, цей один програмний курсор з виразами CURSOR просто і точно вказує на логіку обробки пропозиції SELECT (тобто грає документують роль), в той час як визначення в програмі кількох курсорів без курсорних висловів нічого не говорить про логіку їхньої спільної обробки, так що зрозуміти останню ми зможемо тільки з процедурних конструкцій, а давно відомо, що зрозуміти, що робить програма, з процедурних конструкціям набагато важче, ніж за описами її структур.

Більш того, при використанні курсорною виразу ми позбавлені необхідності його відкривати, відразу приступаючи до операцій FETCH, що швидше у виконанні й економніше в тексті.

Резюме: використання посилання на курсор в реченні SELECT спрощує код програмної обробки, покращує читаність коду і підвищує ефективність його виконання.

Застосування в XSQL


В деяких випадках використання курсорною вираження в SELECT дає вигоду і поза програмою.

Засоби XSQL, що поставляються в рамках штатної поставки ПО СУБД Oracle (“XML Development Kit”, XDK), дозволяють зберігати на сервері web сервлет, породжує за запитом SELECT до бази даних документ XML. Цей сервлет здатний обробляти посилання на курсор, породжувані курсорними виразом.

Підготуємо файл departments.xsql:





<?xml version=”1.0″?>
<xsql:query connection=”demo” xmlns:xsql=”urn:oracle-xsql”>
SELECT
   dname
,  CURSOR ( SELECT ename FROM emp WHERE emp.deptno = dept.deptno )
   AS employees
FROM dept
</xsql:query>

Створимо каталог company в місці файлової системи, передбаченим в Oracle для розташування файлів формату XSQL. Наприклад, при встановленому розширенні XDK ПО Oracle версії 9.2 цим місцем може бути $ ORACLE_HOME / xdk / demo / java . Звернемося за адресою http://localhost:7778/xsql/company/departments.xsql (Сервер HTTP при цьому повинен бути запущений). Отримаємо приблизно такий результат:


У цьому зображенні для стислості вузли ROW з атрибутами num = “2” і num = “3” згорнуті засобами браузера.

Отриманий документ XML може грати для сервера додатків в web як самостійну роль (видаючи результат звернень за певною адресою в web у форматі XML), так і роль вихідного матеріалу для подальшого перетворення XSL (видаючи результат в кінцевому підсумку в форматі HTML, у тому числі з графічним оформленням). Ці перетворення тут не розглядаються, як не пов’язані з можливостями власне Oracle.

Чудово, що обробляє запити XSQL сервлет, розроблений фірмою Oracle, здатний обробляти не тільки поодинокі, але і вкладені вирази типу CURSOR. Підготуємо ще один файл multicursor.xsql і покладемо його в той же каталог company:





<?xml version=”1.0″?>
<xsql:query connection=”demo” xmlns:xsql=”urn:oracle-xsql”>
SELECT
   TO_CHAR ( SYSTIMESTAMP,”SS:FF3″ )
   AS seconds
,  CURSOR ( SELECT TO_CHAR ( SYSTIMESTAMP,”SS:FF3″ ) secondsone

, CURSOR ( SELECT TO_CHAR( SYSTIMESTAMP,”SS:FF3″ )

AS secondstwo
FROM DUAL )

AS leveltwo

FROM DUAL )

   AS levelone
FROM dept
</xsql:query>

Таблиця DEPT тут була взята тільки заради прикладу з малого числа рядків.

Звернемося за адресою localhost:7778/xsql/company/multicursor.xsql і побачимо приблизно такий результат:


Як і в першому випадку, деякі вузли документа згорнуті засобами браузера заради економії у статті місця, займаного картинкою.

Звернення до SYSTIMESTAMP дозволяє спостерігати процес обчислення відповіді сервлетов Oracle.

Неважко збагнути, що у випадку “запиту” на XSQL, так само як і у випадку запиту з курсорними виразом в SQL * Plus, ми маємо справу з ілюзією відсутності програмної обробки, яка на ділі присутній в тексті сервлета і в SQL * Plus, у вбудованому вигляді. Але ж також ми маємо справу з ілюзією таблиці, працюючи з view, що жодним чином не знижує практичної цінності цього поняття.


Посилання по темі



Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*