19июн Стандартные пакеты

Немного общих понятий для расширения кругозора.

  • Внешний вид пакетов
  • Разделение пакетов на группы (условное)
  • Типичный вызов процедуры пакета.

Какой смысл писать самому пакеты, которые уже написаны корпорацией ORACLE? Ознакомимся хотя бы поверхностно с готовыми инструментами, которые нам предлагает Oracle.

Стандартные пакеты начинаются с префикса DBMS_ или UTL_. Название пакетов, написанных разработчиками ядра Oracle, обычно начинаются с DBMS_.

В основном эти пакеты хранятся в скомпилированном виде, хотя можно увидеть спецификацию пакета. Например, тело пакета

PACKAGE BODY dbms_job wrapped
a000000
1
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
b
2159 af6
2Ul/bsdET8UUCQ8E2baVU8oVctowg5WTHl4FYC+7saXqcRNHhSeO0FJ9IZXdX1aQ8KwcShw2
qiVnhLChoX2mKQtAJLwSmP7xVplOhXeoyprNzXMzQpiwAix2Osf/6JNTke4hPvzEMYnplTxv
C5sH+VabVo84jcef9dKnsMYdQEY+E2AmT5YeFmI6bsFHkKYtyv7B9HLbESJOHf85N0nqZkS4
+xSodAamcuAbpOzP6X8Uwo+mjzpjkAlwtZ8cKS7vCrcb1WiIHiM58/dbEfrN0LabyjP7krDZ
 

и т.д. Зато спецификация вполне читабельна:

PACKAGE dbms_job IS
  -- for backward compatibility. Not used anymore.
  any_instance CONSTANT BINARY_INTEGER := 0;

  -- Parameters are:
  --
  -- JOB is the number of the job being executed.
  -- WHAT is the PL/SQL procedure to execute.
  --   The job must always be a single call to a procedure.  The
  --     routine may take any number of hardcoded parameters.
  --     Special parameter values recognized are:
  --       job:       an in parameter, the number of the current job
  --       next_date: in/out, the date of the next refresh
  --       broken:    in/out, is the job broken.  The IN values is FALSE.
  --   Always remember the trailing semicolon.
  --   Some legal values of WHAT (assuming the routines exist) are
  --     'myproc( ''10-JAN-82'', next_date, broken);'
  --     'scott.emppackage.give_raise( ''JENKINS'', 30000.00);'
  --     'dbms_job.remove( job);'
  -- NEXT_DATE is the date at which the job will next be automatically run,
  --   assuming there are background processes attempting to run it.
  -- INTERVAL is a date function, evaluated immediately before the job starts
  --   executing.  If the job completes successfully, this new date is placed
  --   in NEXT_DATE.  INTERVAL is evaluated by plugging it into the statement
  --     select INTERVAL into next_date from dual;
  --   INTERVAL must evaluate to a time in the future.  Legal intervals include
  --     'sysdate + 7'                    -- execute once a week
  --     'NEXT_DAY(sysdate,''TUESDAY'')'  -- execute once every tuesday
  --     'null'                           -- only execute once
  --   If INTERVAL evaluates to null and a job completes successfully, then
  --   the job is automatically deleted from the queue.

  PROCEDURE isubmit    ( job       IN  BINARY_INTEGER,
                         what      IN  VARCHAR2,
                         next_date IN  DATE,
                         interval  IN  VARCHAR2 DEFAULT 'null',
                         no_parse  IN  BOOLEAN DEFAULT FALSE);
  -- Submit a new job with a given job number.

  PROCEDURE submit    ( job       OUT BINARY_INTEGER,
                        what      IN  VARCHAR2,
                        next_date IN  DATE DEFAULT sysdate,
                        interval  IN  VARCHAR2 DEFAULT 'null',
                        no_parse  IN  BOOLEAN DEFAULT FALSE,

                        -- Bug 1346620: replace pkg vars with constants.
                        -- Default for instance = dbms_job.any_instance.
			instance  IN  BINARY_INTEGER DEFAULT 0,
			force     IN  BOOLEAN DEFAULT FALSE );
  -- Submit a new job.  Chooses JOB from the sequence sys.jobseq.
  -- instance and force are added for jobq queue affinity
  -- If FORCE is TRUE, then any positive  integer is acceptable as the job
  -- instance. If FORCE is FALSE, then the specified instance must be running;
  -- otherwise the routine raises an exception.
  -- For example,
  --   variable x number;
  --   execute dbms_job.submit(:x,'pack.proc(''arg1'');',sysdate,'sysdate+1');

и т.д.

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

Условно все пакеты можно разделить на следующие группы:

  • Расширенная поддержка sql и pl/sql
  • Поддержка внешнего ввода-вывода
  • Поддержка типа данных LOB
  • Сигнализация о событиях и поддержка обмена сообщениями между сеансами
  • Расширенная поддержка очередей
  • Поддержка фоновых процессов
  • Поддержка функций управления базами данных
  • Поддержка тиражирования базы данных
  • Пакеты различного назначения.

Загрузка пакетов в базу данных происходит при инсталляции сервера. Но иногда нужно некоторые пакеты установить вручную. Скрипты находятся в папке/rdbms/admin. Основной скрипт на установку всех пакетов catproc.sql . Из этого скрипта вызываются скрипты на индивидуальную установку каждого пакета. Сценарий установки пакетов предусматривает создание общедоступных синонимов.

Приведу пример вызова процедуры в пакете:

declare
    l_job number;
begin
    dbms_job.submit( job       => l_job,
                     what      => 'analyze_my_tables;',
                     next_date => trunc(sysdate)+1+3/24,
                     interval  => 'trunc(sysdate)+1+3/24' );
end; 

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

Комментарии (0)



Новый комментарий

Имя
Электронная почта
 
Ваш сайт
Защита от спама: укажите сумму 5 + 8
   
 

Поиск по блогам



Подпишись на RSS:

RSS - Подписаться на блог



Читателям


Рекомендую к прочтению





Разделы блога



Последние публикации



Последние коментарии