Стандартные пакеты

dbstalker, 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; 

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

 

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

Я не спамер: введите суму 8+8



 

От авторов блога

О Блоге - прочитай перед началом.

Задать вопрос и получить ответ - уже решено 94 вопросов

Глоссарий - список терминов и сокращений


 
 

Бизнес форум

Последние темы:

Микрофон
19 августа, 2 ответа
Сумочка
19 августа, 2 ответа
средства для рук
17 августа, 3 ответа