|
Программирование >> Oracle
Использование объемно-реляционных средств 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х и способов
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |