русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

ИСПОЛЬЗОВАНИЕ DBMS_SQL


Дата добавления: 2015-07-09; просмотров: 644; Нарушение авторских прав


ОБРАБОТКА ОПЕРАТОРОВ DML ПОСРЕДСТВОМ DBMS_SQL. Для обработки операторов UPDATE, DELETE, INSERT средствами модуля DBMS_SQL необходимо последовательно выполнить следующие действия:

1. Открыть курсор.

Осуществляется посредством вызова процедуры OPEN_CURSOR, описание которой в модуле выглядит следующим образом:

 

OPEN_CURSOR return integer;

 

Параметры в данной процедуре отсутствуют.

Каждый вызов возвращает целое число, представляющее собой идентификационный номер курсора. Этот номер используется в последующих вызовах курсора. В границах одного курсора можно по очереди обрабатывать несколько SQL – операторов или выполнять один и тот же оператор несколько раз.

2. Выполнить грамматический разбор оператора.

При выполнении грамматического разбора оператор направляется на сервер БД. Сервер проверяет его синтаксис и семантику и возвращает ошибку (устанавливая исключительную ситуацию), если нарушены требования грамматики. Кроме того, во время разбора определяется план выполнения оператора. Осуществляется грамматический разбор посредством вызова процедуры DBMS_SQL.PARSE, описание которой в модуле имеет следующий вид:

 

procedure PARSE (c in integer, statement in varchar2, language_flag in integer).

 

Здесь с – идентификационный номер курсора, предварительно должен быть открыт посредством OPEN_CURSOR, STATEMENT – оператор, грамматический разбор которого выполняется, LANGUAGE FLAG – указывает, как трактовать оператор, значение NATIVE – режим установленный для той базы данных, с которой выполнено соединение.

3. Привязка входных переменных

При выполнении этой операции, заполнители, указанные в нем связываются с фактическими переменными. Имена заполнители обычно предваряют символом двоеточия. Процедура BIND_VARIABLE выполняет привязку и объявление имен заполнителей. Размер и тип данных фактических переменных также устанавливается BIND_VARIABLE посредством набора переопределенных вызовов:



procedure BIND_VARIABLE (c in integer, name in varchar2, value in number),

procedure BIND_VARIABLE (c in integer, name in varchar2,value in varchar2),

procedure BIND_VARIABLE (c in integer, name in varchar2, value in varchar2,

out_value_size in integer).

 

Здесь параметр NAME – это имя заполнителя, с которым будет связана переменная, VALUE – реальные данные, которые будут привязываться, тип и размер этой переменной также считываются. При необходимости данные, содержащиеся в этой переменной, будут преобразованы. Параметр OUT_VALUE_SIZE – параметр, задаваемый при привязке переменных varchar2 и char; если указан, то это максимальный ожидаемый размер значения в байтах, если не указан, то используется размер, указанный в параметре VALUE.

4. Выполнение оператора.

Осуществляется посредством функции EXECUTE. Описание её в модуле выглядит следующим образом:

 

function EXECUTE (c in integer) return integer;

 

Здесь с – идентификатор предварительно открытого курсора.

Функция EXECUTE возвращает число отработанных строк (в этом смысле возвращаемое значение аналогично курсорному атрибуту %ROWCOUNT). Следует учесть, что возвращаемое значение не определено для операторов выборки, а также и то, что EXECUTE вызывается из выражений программ.

5. Закрытие курсора

Закрытие курсора осуществляется посредством вызова процедуры CLOSE_CURSOR, описание которой выглядит следующим образом:

 

procedure CLOSE_CURSOR (c in out integer).

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

Приведем пример:

 

create or replace procedure update_address (p_lname in staff.lname %type,

p_fname in staff.fname %type,

p_newaddress in staff.address %type,

p_rowsupdated out integer) is

v_cursor_id integer;

v_updatestmt varchar2(100);

begin

v_cursor_id := DBMS_SQL.OPEN_CURSOR;

v_updatestmt := ‘update staff

set address =:na

where fname=:fname and lname=:lname’;

DBMS_SQL.PARSE (v_cursor_id, v_updatestmt, DBMS_SQL.NATIVE);

DBMS_SQL.BIND_VARIABLE (v_cursor_id, :na, p_newaddress);

DBMS_SQL.BIND_VARIABLE (v_cursor_id, :fname, p_fname);

DBMS_SQL.BIND_VARIABLE (v_cursor_id, :lname, p_lname);

p_rowsupdated:= DBMS_SQL.EXECUTE (v_cursor_id);

DBMS_SQL.CLOSE_CURSOR(v_cursor_id);

exception

when others then

DBMS_SQL.CLOSE_CURSOR(v_cursor_id);

raise;

end update_address;

 

ОБРАБОТКА ЗАПРОСОВ НА ИЗВЛЕЧЕНИЕ ИНФОРМАЦИИ.Производится путем последовательного выполнения всех ниже перечисленных действий:

1. Открытие курсора (OPEN_CURSOR),

2. Выполнение грамматического разбора (PARSE),

3. Выполнение привязки всех входных переменных (BIND_VARIABLE),

4. Описание элементов списка выбора (DEFINE_COLUMN),

5. Исполнения запроса (EXECUTE),

6. Считывания строк (FETCH),

7. Запись результатов в переменные (COLUMN_VALUE),

8. Закрытие курсора (CLOSE_CURSOR).

Как видно для динамического выполнения запросов необходимо использовать вызовы тех же процедур модуля DBMS_SQL, что и при выполнении инструкций DML, за исключением DEFINE_COLUMN, FETCH и COLUMN_VALUE. Рассмотрим подробнее как использовать эти процедуры.

Определение элементов списка выбора напоминает процесс привязки входных переменных, за исключением того, что элементы списка выбора должны быть не привязаны, а только определены. В процедуре DEFINE_COLUMN указываются типы и размер переменных, в которые считываются элементы списка выбора. Каждый элемент при этом преобразуется в тип соответствующей переменной.

 

procedure DEFINE_COLUMN (c in integer, position in integer, column in

number),

procedure DEFINE_COLUMN (c in integer, position in integer,column in

varchar2, column_size in integer).

 

Для переменных VARCHAR2 нужно обязательно указывать параметр COLUMN_SIZE, поскольку система поддержки PL/SQL должна знать максимальный размер этих переменных во время выполнения программы, так как в отличие от NUMBER, DATE данные этих типов не имеют фиксированной длины, заранее известной компилятору. Тип и предназначение параметров процедуры DEFINE_COLUMN приведены в таблице 5.

Таблица 5 Параметры DEFINE_COLUMN

Параметр Тип Предназначение
с integer Идентификатор курсора.
position integer Позиция пункта списка выбора.
column number, varchar2 Переменная, определяющая тип и размер выходной переменной. Имя переменной не играет особой роли, однако тип и размер важны. Однако как в DEFINE_COLUMN, так и в COLUMN_VALUE обычно используются одни и те же переменные.
column_size integer Максимальный ожидаемый размер данных. Обязателен для тех типов, длина которых не известна заранее системе поддержки PL/SQL.

Считывание строк: строки набора запроса считываются в буфер посредством вызова функции FETCH_ROWS. Функция описана в модуле следующим образом:

 

function FETCH_ROWS (c in integer) return integer.

 

FETCH_ROWS возвращает число считываемых строк. FETCH_ROWS и COLUMN_VALUE вызывают в цикле несколько раз до тех пор, пока FETCH_ROWS не возвратит нуль.

Для записи результатов в переменные PL/SQL следует вызывать процедуру COLUMN_VALUE. Эта процедура вызывается после успешного выполнения FETCH_ROWS. Если в выборке не были возвращены строки, (что указывается возвратом 0 функцией FETCH_ROWS) COLUMN_VALUE устанавливает для выходной переменной NULL – значение. Ниже приведено описание процедуры в модуле DBMS_SQL:

 

procedure COLUMN_VALUE (c in integer, position in integer, value out

number);

procedure COLUMN_VALUE (c in integer, position in integer, value out number,

column_error out number,

actual_length out number);

procedure COLUMN_VALUE (c in integer, position in integer, value out

varchar2),

procedure COLUMN_VALUE (c in integer, position in integer, value out varchar2, column_error out number, actual_length out number).

Тип и предназначение параметров процедуры COLUMN_VALUE приведены в таблице 6.

 

Таблица 6 Параметры процедуры COLUMN_VALUE

Параметр Тип Предназначение
с integer Идентификатор курсора.
position integer Относительная позиция в списке выбора, как и в DEFINE_COLUMN, позиция первого элемента списка =1.
   
  Продолжение таблицы 6
value number, varchar2 Выходная переменная, если тип этого параметра отличается от типа, указанного в DEFINE_COLUMN то возникает ошибка, что соответствует исключительной ситуации DBMS_SQL.INCONSISTENT_TYPES.
column_error number Код ошибки столбца, выдается в виде отрицательного числа. Ошибка будет устанавливать исключительную ситуацию, а column_error позволяет определить, какой из столбцов стал причиной конкретной ошибки. Если столбец был успешно прочитан, то column_error=0.
actual_length number Если указан, то в данной переменной будет находится исходный размер столбца (размер столбца перед его считыванием). Это удобно в случае, когда размер переменной недостаточен и значение усекается (это также приводит к ошибке).

 

В нижеследующем примере создается процедура, определяющая имена и фамилии сотрудников по заданной для данной процедуры должности сотрудника:

 

create or replace procedure DynamicQuery (p_position in staff.position %type) is

v_cursor_id integer;

v_select_stmt varchar2(500);

v_first_name staff.fname %type;

v_last_name staff.lname %type;

v_dummy integer;

begin

v_cursor_id := DBMS_SQL.OPEN_CURSOR;

v_select_stmt := ‘select lname, fname

from staff

where position = :pos

order by lname’;

DBMS_SQL.PARSE (v_cursor_id, v_select_stmt, DBMS_SQL.NATIVE);

DBMS_SQL.BIND_VARIABLE (v_cursor_id, ‘:pos’, p_position);

DBMS_SQL.DEFINE_COLUMN (v_cursor_id, 1, v_last_name, 25);

DBMS_SQL.DEFINE_COLUMN (v_cursor_id, 2, v_first_name, 25);

v_dummy := DBMS_SQL.EXECUTE (v_cursor_id);

loop

if DBMS_SQL.FETCH_ROWS (v_cursor_id)=0 then

exit;

end if;

DBMS_SQL.COLUMN_VALUE (v_cursor_id, 1, v_last_name);

DBMS_SQL.COLUMN_VALUE (v_cursor_id, 2, v_first_name);

insert into temp_table (name_col)

values (v_last_name || ’ ’ || v_first_name);

end loop;

DBMS_SQL.CLOSE_CURSOR (v_cursor_id);

commit;

exception

when others then

--ЗАКРОЕМ КУРСОР, А ЗАТЕМ ПОВТОРНО УСТАНОВИМ ОШИБКУ

DBMS_SQL.CLOSE_CURSOR (v_cursor_id);

raise;

end DynamicQuery;

 



<== предыдущая лекция | следующая лекция ==>
МОДУЛЬ DBMS_SQL | БЕЗОПАСНОСТЬ ОПЕРАЦИОННОЙ СИСТЕМЫ


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.623 сек.