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;
Еще небольшое, но важное замечание. Процедуры и функции в стандартных пакетах выполняются с правами пользователя, который их вызвал.
Если они вызваны из хранимой процедуры или функции, то владеют правами пользователя, который владеет вызывающей процедурой.