Выполнение программ.
Для написания программ использовался интегрированная компонента продуктов
ORACLE, процедурное расширение языка SQL - язык PL/SQL. (PL - Procedural
Language - процедурный язык.) PL/SQL - язык четвертого поколения, объединяющий
структурированные элементы процедурного языка программирования с языком SQL.
Язык PL/SQL разработан специально для организации вычислений в среде
клиент/сервер. Он позволяет передать на сервер программный блок PL/SQL,
содержащий логику приложения, как оператор SQL, одним запросом. Используя
PL/SQL, можно значительно уменьшить объем обработки в клиентской части
приложения и нагрузку на сеть. PL/SQL способствует ускорению разработки и
улучшению эффективности серверной части приложений. Конечно язык PL/SQL не
является в такой же степени многофункциональным, как языки C или Java. Однако
в рамках данной работы я считаю, что заложенных в нем функций практически
полностью хватает для выполнения необходимых операций.
Программа, которая создает тестовую базу данных.
Для проведения экспериментов, как уже упоминалось раньше, была разработана
тестовая база данных. Для запуска программы в среде SQL*Plus надо выполнить команду:
@A:\DB\crdb_tb.sql
@A:\DB\crdb_tbend.sql
@A:\CRDBPR#\crdb#.sql
@A:\CRDBPR#\crdbpr_end#.sql
CREATE FUNCTION pr_serv ( pr_num_serv IN INTEGER, num_gen IN INTEGER ) RETURN INTEGER IS pr_id_serv INTEGER; pr_name_serv r_str%ROWTYPE; pr_describe r_str%ROWTYPE; pr_cost r_gen%ROWTYPE; pr_duration r_gen%ROWTYPE; n_gen INTEGER; BEGIN n_gen := num_gen; LOOP SELECT serv_seq.NEXTVAL INTO pr_id_serv FROM dual; pr_name_serv := random_str(9999999999,2,n_gen); pr_describe := random_str(9999999999,4,pr_name_serv.v1); pr_cost := random_gen(99999,pr_describe.v1); pr_duration := random_gen(999,pr_cost.v1); n_gen := pr_duration.v1; INSERT INTO service VALUES(pr_id_serv,pr_name_serv.v2,pr_describe.v2, pr_cost.v2,pr_duration.v2); IF MOD(pr_id_serv,10000) = 0 THEN COMMIT; END IF; EXIT WHEN pr_id_serv >= pr_num_serv; END LOOP; COMMIT; RETURN n_gen; END pr_serv;Пример функции из второй программы.
CREATE FUNCTION pr_serv ( pr_num_serv IN INTEGER, pr_ni_serv IN INTEGER, num_gen IN INTEGER ) RETURN INTEGER IS pr_id_serv INTEGER; pr_name_serv r_str%ROWTYPE; pr_describe r_str%ROWTYPE; pr_cost r_gen%ROWTYPE; pr_duration r_gen%ROWTYPE; n_gen INTEGER; TYPE type_id_serv IS TABLE OF service.id_serv%TYPE INDEX BY BINARY_INTEGER; TYPE type_name_serv IS TABLE OF service.name_serv%TYPE INDEX BY BINARY_INTEGER; TYPE type_describe IS TABLE OF service.describe%TYPE INDEX BY BINARY_INTEGER; TYPE type_cost IS TABLE OF service.cost%TYPE INDEX BY BINARY_INTEGER; TYPE type_duration IS TABLE OF service.duration%TYPE INDEX BY BINARY_INTEGER; serv_id_serv type_id_serv; serv_name_serv type_name_serv; serv_describe type_describe; serv_cost type_cost; serv_duration type_duration; BEGIN n_gen := num_gen; FOR i IN 1 .. pr_num_serv LOOP pr_name_serv := random_str(9999999999,2,n_gen); pr_describe := random_str(9999999999,4,pr_name_serv.v1); pr_cost := random_gen(99999,pr_describe.v1); pr_duration := random_gen(999,pr_cost.v1); n_gen := pr_duration.v1; serv_id_serv(i) := pr_ni_serv + i; serv_name_serv(i) := pr_name_serv.v2; serv_describe(i) := pr_describe.v2; serv_cost(i) := pr_cost.v2; serv_duration(i) := pr_duration.v2; END LOOP; FORALL i IN 1 .. pr_num_serv INSERT INTO service VALUES(serv_id_serv(i),serv_name_serv(i),serv_describe(i), serv_cost(i),serv_duration(i)); COMMIT; RETURN n_gen; END pr_serv;