Иван Сергеевич Задворьев - Язык PL/SQL стр 30.

Шрифт
Фон

изменяет параметры задания

WHAT (процедура)

изменяет описание задания

NEXT_DATE (процедура)

изменяет следующее время выполнения задания

REMOVE (процедура)

удаляет задание из очереди

RUN (процедура)

указывает немедленно выполнить задание

INTERVAL (процедура)

изменяет интервал между запусками задания

Будем рассматривать в качестве задания анонимный блок PL/SQL, запускающий процедуру p1.

CREATE TABLE job_test (insert_date DATE);

CREATE PROCEDURE p1 AS

BEGIN

INSERT INTO job_test VALUES(SYSDATE);

COMMIT;

END;

Отправим задание в очередь со следующими параметрами:

SQL> DECLARE

2 l_job_num INTEGER;

3 BEGIN

4 DBMS_JOB.submit(job =>l_job_num,

5 what=>'BEGIN p1; END;',

6 next_date=>sysdate,

7 interval=>'sysdate+10/24/60/60');

8 COMMIT;

9 DBMS_OUTPUT.PUT_LINE(l_job_num);

10 END;

11 /

23

PL/SQL procedure successfully completed.

В очередь будет помещено новое задание BEGIN p1; END; с немедленным выполнением после помещения в очередь и последующим выполнением каждые десять секунд, что задается выражением sysdate+10/24/60/60. На экран выводится уникальный номер задания, назначенный ему при постановке в очередь (23). Важно отметить, что после вызова процедуры DBMS_JOB.submit необходимо явно зафиксировать транзакцию, в противном случае задание в очередь поставлено не будет.

Посмотрим на результаты работы процедуры p1 и убедимся, что задание запускается каждые десять секунд:

SQL> SELECT TO_CHAR(insert_date,'DD.MM.YYYY HH24:MI:SS') AS insert_date

2 FROM job_test ORDER BY insert_date;

INSERT_DATE

25.01.2015 11:26:18

25.01.2015 11:26:28

25.01.2015 11:26:38

Данные о заданиях пользователя, которые в данный момент находятся в очереди, можно просмотреть в представлении словаря-справочника данных USER_JOBS:

SQL> SELECT job,log_user,last_sec,next_sec,broken,interval,what

2 FROM USER_JOBS;

JOB LAST_SEC NEXT_SEC BROKEN INTERVAL WHAT

 

23 11:26:51 11:27:01 N sysdate+10/24/60/60 BEGIN p1; END;

В первом столбце отображаются номера заданий, назначаемые им при постановке в очередь. В следующих столбцах отображаются время последнего и следующего выполнения задания, интервал выполнения и анонимный блок PL/SQL для выполнения задания. Меткой BROKEN (заблокировано) помечаются те задания, при шестнадцати попытках выполнения которых произошли ошибки. Заблокированные задания перестают выполняться, поэтому администратору баз данных следует контролировать содержание представления DBA_JOBS, в котором отображаются сведения обо всех заданиях. Если в задании временно отпала необходимость, то его можно пометить как заблокированное специально, используя для этого процедуру DBMS_JOB.broken.

Удаляется из очереди задание следующим образом:

SQL> BEGIN

2 DBMS_JOB.remove(23);

3 COMMIT;

4 END;

5 /

PL/SQL procedure successfully completed.

Файловый ввод-вывод

Встроенный пакет UTL_FILE предоставляет программам PL/SQL возможность работать с файлами на сервере. С помощью этого пакета можно решать следующие задачи:

формирование на сервере небольших текстовых отчетов;

загрузка в базу данных строк небольших текстовых файлов;

чтение log-файлов сервера для мониторинга ошибок;

формирование log-файлов программ PL/SQL.

Для загрузки/выгрузки данных значительных (мегабайты, гигабайты) объемов следует использовать не пакет UTL_FILE, а использовать клиентские приложенияSQL*Loader для загрузки данных и SQL*Plus для их выгрузки. Если запускать эти утилиты на сервере баз данных, то их использованиесамый быстрый способ загрузить и выгрузить данные из базы в файлы. В то же время при разработке серверной бизнес-логики встречаются ситуации, когда читать и писать в файлы хотелось бы именно в хранимых программах на PL/SQL без усложнений, вызванных обращениями к другим средствам. Чтобы для каждого поступившего платежа выгружать на сервере XML-файл размером меньше килобайта пакет UTL_FILE вполне подходит.

Настройка ограничений доступа к каталогам

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

По этой причине перед использованием пакета UTL_FILE требуется настроить ограничения доступа к каталогам, с файлами из которых сможет осуществлять операции пакет. Настроить ограничения доступа к каталогам можно сделать двумя способами:

использовать параметр базы данных utl_file_dir;

создать специальные объекты баз данныхдиректории (DIRECTORY) и предоставить пользователям привилегии доступа к ним.

В параметре utl_file_dir задается список каталогов, с файлами из которых может осуществлять операции UTL_FILE. Для просмотра текущего значения параметра utl_file_dir можно использовать представление словаря данных V$PARAMETER или команду SHOW PARAMETER утилиты SQL*Plus:

SQL> SELECT value dir FROM V$PARAMETER

2 WHERE name='utl_file_dir';

DIR

C:\Dir1

SQL> SHOW PARAMETER utl_file_dir

NAME TYPE VALUE

 

utl_file_dir string C:\Dir1

Значением параметра utl_file_dir может быть и символ *, что означает, что с помощью пакета UTL_FILE можно получить доступ к файлам в любых каталогах, к которым есть доступ у пользователя oracle операционной системы сервера. Выставление этого параметра таким способом обычно практикуется в тестовых инсталляциях и должно быть совершенно исключено в production по требованиям безопасности.

Директория (directory)объект баз данных Oracle, являющийся псевдонимом каталога в файловой системе сервера. Директории создаются DDL-командами следующего вида:

SQL> CREATE OR REPLACE DIRECTORY dir1 AS 'C:\Dir1';

Directory created.

По сравнению с использованием параметра utl_file_dir, директории дают более гибкие возможности по управлению доступом к файлам. Так, после того как директория создана, администратор базы данных может предоставить конкретным пользователям привилегии только на чтение из нее:

SQL> GRANT READ ON DIRECTORY dir1 TO user1;

Grant succeeded.

Параметр utl_file_dir задает список каталогов сразу для всех пользователей, которые имеют привилегии на выполнение программ пакета UTL_FILE, причем настроить конкретные действия (чтение или запись) с файлами из этих каталогов с его помощью нельзя.

Использование UTL_FILE

В пакете UTL_FILE используется следующая последовательность действий с файламисначала файл открывается в заданном режиме, затем производятся действия с его содержимым, по окончании которых файл закрывается. После открытия файла во все процедуры и функции пакета UTL_FILE передается его идентификатор, который представляет собой переменную-запись PL/SQL объявленного в пакете UTL_FILE типа.

Таблица 9. Программы пакета UTL_FILE.

Программа

Описание программы

FOPEN (функция)

открывает файл для чтения/записи

IS_OPEN (функция)

проверяет, открыт ли файл

FCLOSE (процедура)

закрывает открытый файл

FCLOSE_A (процедура)

закрывает все открытые файлы (aall)

GET_LINE (процедура)

считывает строку из файла

PUT (процедура)

записывает в файл строку без символа конца строки

PUT_LINE (процедура)

записывает в файл строку с символом конца строки

PUTF (процедура)

записывает в файл форматированный текст

FFLUSH (процедура)

вызывает физическую запись буферизированных данных

Файл может быть открыт процедурой UTL_FILE.FOPEN в одном из трех режимов:

для чтения (read)содержимое файла не будет изменяться;

для записи (write)содержимое файла будет перезаписано;

для добавления данных (append)запись будет осуществляться в конец файла без перезаписи имевшегося содержимого.

В качестве примера работы с пакетом UTL_FILE приведем код процедуры table_copy, которая построчно сохраняет выборку SQL-запроса к таблице tab1 в файл. У table_copy имеется параметр p_mode, определяющий режим открытия файла.

SQL> CREATE OR REPLACE PROCEDURE table_copy(p_mode IN VARCHAR2) IS

2 fid UTL_FILE.FILE_TYPE;

3 BEGIN

4 fid := UTL_FILE.FOPEN (location=> 'C:\Dir1',

filename => 'f-name.txt',

open_mode=> p_mode);

5 FOR rec IN (SELECT at1,at2 FROM tab1) LOOP

6 UTL_FILE.PUT_LINE (fid, rec.at1||' '||rec.at2);

7 END LOOP;

Ваша оценка очень важна

0
Шрифт
Фон

Помогите Вашим друзьям узнать о библиотеке

Скачать книгу

Если нет возможности читать онлайн, скачайте книгу файлом для электронной книжки и читайте офлайн.

fb2.zip txt txt.zip rtf.zip a4.pdf a6.pdf mobi.prc epub ios.epub fb3