Oracle

В данном разделе представлены выдержки и некоторые программы из моего диплома,
посвященного настройке и оптимизации работы сервер ORACLE.



Выполнение программ.

Для написания программ использовался интегрированная компонента продуктов 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

Для удаления программы в среде SQL*Plus надо выполнить команду:
@A:\DB\crdb_tbend.sql


Программа, которая заполняет тестовую базу данных. В этом пункте представлены две функции из двух программ. Обе программы заполняют тестовую базу данных. Для запуска каждой из программ в среде SQL*Plus надо выполнить команду:
@A:\CRDBPR#\crdb#.sql

Для удаления программ в среде SQL*Plus надо выполнить команду:
@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;


Архив первой программы, которая заполняет тестовую базу я не стал выкладывать, так как данная программа работает в два раза дольше чем вторая программа.



prev next
Hosted by uCoz