Программирование >>  Oracle 

1 ... 334 335 336 [ 337 ] 338 339 340 ... 469


Использование объемно-реляционных средств 1429

22 null, sysdate, 1000, 500);

24 update dept or

25 set emps = l emps

26 where deptno = 10;

27 end;

28 /

удaлeнo 1 измeнeнo 2 встaвлeнo 1

PL/SQL procedure successfully completed.

scott@TKYTE816> update dept or set dname = initcap(dname);

06pa6oTKa влoжeннoй тaблицы пpoщeнa

06pa6oTKa влoжeннoй тaблицы пpoщeнa

06pa6oTKa влoжeннoй тaблицы пpoщeнa

06pa6oTKa влoжeннoй тaблицы пpoщeнa

4 rows updated.

scott@TKYTE816> commit;

Commit complete.

Триггер преобразует наши действия с экземпляром объекта в соответствующие изменения базовых реляционных таблиц.

Возможность работать с реляционными данными через объектно-реляционные представления позволяет максимально использовать преимущества как реляционной, так и объектно-реляционной модели.

Реляционная модель сильна тем, что с ее помощью можно ответить практически на любой вопрос о базовых данных. Рассматриваются ли данные по отделам (надо запросить информацию об отделе и его сотрудниках) или по сотрудникам (надо задать номер сотрудника и получить информацию об отделе, в котором он работает), всегда есть возможность выполнить соответствующий запрос. Реляционные таблицы можно использовать непосредственно или сгенерировать модель на основе объектного типа - все не-обходим1е данные будут объединены и представлены в удобном для использования виде. Рассмотрим результаты следующих запросов:

scott@TKYTE816> select * from dept or where deptno = 10;

DEPTNO DNAME LOC EMPS(EMPNO, ENAME, JOB, MGR,

HIREDATE, S

10 Accounting NEW YORK EMP TAB TYPE(EMP TYPE(7782, Clark,

MANAGER1, 7839, 09-JUN-81, 2450, NULL), EMP TYPE(7 83 9, King,

PRESIDENT, NULL, 17-NOV-81, 5000, NULL), EMP TYPE(1234, Tom, Boss, NULL, 25-MAR-01, 1000, 500)) scott@TKYTE816> select dept.*, empno, ename, job, mgr, hiredate, sal, comm

2 from emp, dept

3 where emp.deptno = dept.deptno

4 and dept.deptno = 10



1430 Глава 20

DEPTNO DNAME LOC EMPNO ENAME JOB MGR HIREDATE SAL COM

10 Accounting NEW YORK 7782 Clark MANAGER 7839 09-JUN-81 2450

10 Accounting NEW YORK 7839 King PRESIDENT 17-NOV-81 5000

10 Accounting NEW YORK 1234 Tom Boss 25-MAR-01 1000 500

Они возвращают похожие данные. Первый запрос в сжатом виде выдает всю информацию об отделе в виде одной строки. Он может возвращать несколько вложенных таблиц, для чего в классическом языке SQL пришлось бы выполнить несколько запросов.

На сервере можно выполнить много действий, формируя ответ и возвращая его в виде одной строки. Когда работа выполняется в среде, где лишних обменов данными по сети следует избегать (из-за большого времени ожидания), это дает существенные преимущества. Не говоря уже о том, что один простой оператор SELECT * FROM T может выполнить действия нескольких SQL-операторов. Учтите также, что в объектном представлении нет повторяющихся столбцов данных. Значения столбцов DEPTNO, DNAME и LOC не повторяются для каждого сотрудника; они возвращаются только один раз, что для многих приложений более удобно.

Второй запрос требует от разработчика более глубокого знания данных, и эту особенность следует учитывать. Надо знать, как соединять данные; если же соединяется много таблиц, возможно, потребуются дополнительные запросы, результаты которых придется обрабатывать самостоятельно. Поясню. Предположим, в модели необходимо учесть бюджет отдела на финансовый год. Он хранится в следующей реляционной таблице:

scott@TKYTE816>create table dept fy budget

2 (deptno number(2) references dept,

3 fy date,

4 amount number,

5 constraint dept fy budget pkprimary key(deptno,fy)

Table created.

В этой таблице хранятся данные о бюджете отделов за этот и несколько предыдущих финансовых лет. Для работы приложения необходимо представление данных по отделам, включающее все скалярные данные (название, местонахождение). Кроме того, необходима информация о сотрудниках (столбец типа EMP TAB TYPE), а также данные о бюджете за последние финансовые годы. Для получения этих данных по реляционной модели разработчику приложения придется выполнять следующие операторы:

scott@TKYTE816> select dept.*, ettpno, ename, job, mgr, hiredate, sal, comn

2 from emp, dept

3 where emp.deptno = dept.deptno

4 and dept.deptno = 10

DEPTNO DNAME LOC EMPNO ENAME JOB MGR HIREDATE SAL COM

10 Accounting NEW YORK 7782 Clark MANAGER 7839 09-JON-81 2450 10 Accounting NEW YORK 7839 King PRESIDENT 17-NOV-81 5000 10 Accounting NEW YORK 1234 Tom Boss 25-MAR-01 1000 500



Использование объектно-реляционных средств 1431

3 rows selected.

scott@TKYTE816> select fy, amount

2 from dept fy budget

3 where deptno = 10

FY AMOUNT

01-JAN-99 500

Ol-JAN-00 750

01-JAN-01 1000

3 rows selected.

Нельзя написать один реляционный запрос, выдающий все эти данные. Можно использовать ряд расширений Oracle (функцию CURSOR в SQL) возврата строк, каждая из которых содержит результирующее множество:

scott@TKYTE816> select

2 dept.deptno, dept.dname,

3 cursor(select empno from emp where deptno = dept.deptno) ,

4 cursor(select fy, amount from dept fy budget where deptno =

dept.deptno)

5 from dept

6 where deptno = 10

DEPTNO DNAME CURSOR(SELECTEMPNOFR CURSOR(SELECTFY,AMOU

10 ACCOUNTING CURSOR STATEMENT : 3 CURSOR STATEMENT : 4 CURSOR STATEMENT : 3

EMPNO

7782 7839 7934

3 rows selected.

CURSOR STATEMENT : 4

FY AMOUNT

01-JAN-99 500

Ol-JAN-00 750

Ol-JAN-01 1000

3 rows selected. 1 row selected.

В данном случае б1ла выбрана одна строка, вернувшая клиенту еще два курсора. Клиеское приложение выбрало данные из этих двух курсоров и в1дало результат!. то прекрасно работает, но требует знания особенностей базов1х данн1х и способов



1 ... 334 335 336 [ 337 ] 338 339 340 ... 469

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика