В Delphi существует немало компонентов для работы с базой данных Oracle. Один из них это Direct Oracle Access или DOA по простому от компании Allround Automations. Компонент довольно старый, известный и очень популярный у нас. DOA работает в базой данных Oracle при наличии установленного клиента Oracle на локальной машине по протоколу OCI.
Может быть DOA и не самый лучший на рынке, но обладает двумя неоспоримыми преимуществами. Во первых, работает он стабильно, во вторых, доступен в исходных кодах. Бесплатен, так сказать из-за этой своей "доступности". Я думаю, винить в в такой доступности должны себя сами ребята из Allround Automations, нечего исходниками разбрасываться, а нашему человеку такая доступность на руку, как вы понимаете. Многие разработчики никогда не используют нестандартные компоненты для Delphi, если они не в исходных кодах. Я полностью разделяю это мнение.
Доступен этот компонент в полных исходниках также вот по этой
ссылке для разных версий Delphi. Да, эта доступность означает только возможность ознакомления с компонентом и его устройством, но вы не можете его использовать в реальных коммерческих разработках и вообще ни для каких целей, кроме ознакомления и тестирования. Понимаете? Ну и хорошо, продолжим.
В этой статье будет сделан краткий обзор основных компонентов DOA, за более полной информацией необходимо обратиться к официальной документации.
После установки DOA вы найдете его визуальные компоненты на вкладке Oracle палитры компонентов Delphi:
TOracleSession
Основным компонентом DOA является TOracleSession, который управляет сессией Oracle и на который должны ссылаться все другие компоненты DOA. Использование TOracleSession очень простое, вам необходимо задать значения свойств LogonDatabase, LogonUsername, LogonPassword и выполнить процедуру Logon. Если все нормально, то TOracleSession присоединится к базе данных Oracle. Из свойств TOracleSession можно выделить свойство ThreadSafe, которое необходимо выставить в true в том случае, если вы запускаете в потоках обращение к базе данных Oracle.
TOracleLogon
Для выполнения визуального коннекта к базе данных Oracle предназначен компонент TOracleLogon. Для этого выставляем свойство компонента Session, ссылаясь на существующий TOracleSession и выполняем метод Execute; В результате появляется окно для ввода имени пользователя и пароля:
TOracleQuery
Для работы с данными базы данных Oracle предназначен компонент
TOracleQuery. Для выполнения запроса к данным необходимо запрос записать в свойство SQL, а затем выполнить метод
Execute. Пример работы с TOracleQuery:
uses ... ,Oracle;
procedure query_test;
var Q: TOracleQuery;
begin
Q:=TOracleQuery.Create(nil);
try
Q.Session:=OracleSession1;
Q.SQL.Text:='select * from all_objects where object_type=''TABLE''';
Q.Execute;
while not Q.Eof do
begin
...
Q.Next;
end;
finally
Q.Free;
end;
end;
В этом примере в uses подключаем модуль Oracle. Здесь экземпляр TOracleQuery создается непосредственно в коде, но вы можете использовать и визуальный вариант компонента. Остальное все просто и понятно из кода.
В случае, если вам необходимо динамически формировать запросы с разными условиями в коде вашей программы, то можно просто формировать текст SQL запроса в виде строки. Так почему-то делают многие. Но такой подход необходимо объявить безграмотным, так как постоянно отправляя серверу Oracle тексты запросов со значениями переменных вы заставляете сервер выполнять постоянный полный разбор ваших запросов. Во многих случаях это может привести к деградации производительности вашего сервера. Правильный решением будет использование переменных DOA, в этом случае сервер Oracle будет использовать так называемый мягкий и быстрый разбор SQL запроса. Для работы с переменными в TOracleQuery предназначены методы
DeclareVariable и
SetVariable. Пример, приведенный выше, является с этой точки зрения неправильным, так как в условии
where значение литерала непосредственно зашито в SQL запросе. А вот пример правильного использования
TOracleQuery:
uses ... ,Oracle;
procedure query_test;
var Q: TOracleQuery;
begin
Q:=TOracleQuery.Create(nil);
try
Q.Session:=OracleSession1;
Q.DeclareVariable('obj_type',otString);
Q.SetVariable('obj_type','TABLE');
Q.SQL.Text:='select * from all_objects where object_type=:obj_type';
Q.Execute;
while not Q.Eof do
begin
...
Q.Next;
end;
finally
Q.Free;
end;
end;
При объявлении переменной необходимо указать ее тип, в нашем случае это тип otString. Другими общеупотребительными типами являются otInteger, otFloat, otDate, otBoolean. Полный список типов переменных смотрите в документации или непосредственно в исходном коде модуля Oracle.pas.
TOracleDataSet
Компонент TOracleDataSet является наследником от TDataSet и в основном предназначен как источник данных для визуализации в TDBGrid. Использование компонента состоит в определении запроса в свойстве SQL. В SQL запросе можно использовать переменные, определенные в свойстве Variables. Переменные можно определить визуально:
Переменные также можно определять и программно, подобно приведенному выше примеру с TOracleQuery. Синтаксис использования переменных в SQL запросах всегда двоеточие и имя переменной, например

bj_type. Если в процессе выполнения вашей программы значения переменных изменяются, то вы должны записать новое значение переменной методом
SetVariable и затем выполнить запрос с новым значением переменной при помощи процедуры
Refresh.
Если вы хотите, чтобы ваш TOracleDataSet можно было редактировать, то SQL запрос необходимо написать таким образом:
SELECT e.*, e.rowid FROM mytable e
В этом SQL запросе помимо получения всех столбцов таблицы запрашивается также внутренний идентификатор записи Oracle rowid. В таком варианте запроса DOA автоматически делает TOracleDataSet доступным для редактирования. Иначе TOracleDataSet будет доступен только для чтения.
TOracleDataSet позволяет использовать последовательности или Sequence Oracle для автоматического заполнения идентификаторов записей. Для этого кликните по свойству SequenceFiled и определите требуемую последовательность Oracle, поле, в которое будет записывться значение из последовательности и момент, к который будет происходить формирования значения из последовательности:
Стоит обратить внимание на свойство QueryAllRecords, которое по умолчанию установлено в true. В этом случае TOracleDataSet будет считывать все записи из таблиц SQL запроса. Если запрос возвращает много данных, то могут быть проблемы со скоростью выполнения и использованием памяти. Рекомендуется выставить это свойство а false и определить размер буфера для считывания порций данных. Это свойство ReadBuffer, значение по умолчанию 25 записей.
Еще одно важное свойство CommitOnPost по умолчанию выставлено в true, что означает выполнение Oracle commit на каждый Post в TOracleDataSet. Это может быть не всегда удобно, так как всегда автоматически завершает текущую транзакцию Oracle и начинает новую. Для программного контроля транзакций Oracle выставите это свойство в false.
Из других особенностей TOracleDataSet можно отметить автоматическое создание связи Master-Detail между двумя таблицами Oracle и двумя TOracleDataSet соответственно. Правда для автоматического создания такой связи таблицы Oracle должны быть связаны при помощи внешних ключей непосредственно в самой базе данных. Для выполнения автоматического создания связи необходимо в подчиненном TOracleDataSet в свойстве Master выбрать родительский TOracleDataSet. В результате этого TOracleDataSet при помощи системных таблиц Oracle Database найдет всю необходимую информацию и предложит вам модифицировать запрос подчиненного TOracleDataSet:
В результате вы увидите для подчиненного TOracleDataSet созданную новую переменную и измененный SQL запрос, использующий эту переменную. Также для подчиненного TOracleDataSet будут автоматически указаны все необходимые свойства для создания Master-Detail связи.
TOracleNavigator
Компонент TOracleNavigator является заменой стандартному TDBNavigator-у и отличается дополнительными кнопками nbEnterQBE и nbExecuteQBE, предназначенными для работы TOracleDataSet в режиме QBE - Query By Example или в режиме запроса данных по образцу. Реализация режима QBE в этом кратком обзоре не рассматривается и заслуживает отдельной статьи.
TOraclePackage
Компонент
TOraclePackage является удобным инструментом для выполнения процедур и функций, расположенных в серверных
PL/SQL пакетах базы данных Oracle. Пример использования TOraclePackage:
uses ... ,Oracle;
procedure test_package;
var P: TOraclePackage;
n: real;
begin
P:=TOraclePackage.Create(nil);
try
P.Session:=OracleSession1;
P.CallProcedure('mypackage.proc_1',[10,Now]);
n:=P.CallIntegerFunction('mypackage.func_1',[25,null]);
finally
P.Free;
end;
end;
В этом примере показан вызов процедуры с именем proc_1, расположенной в PL/SQL пакете mypackage с параметрами с типами number и date. Значение параметров передаются через массив array of Variant. Следующая строка примера вызывает функцию с именем func_1 PL/SQL пакета mypackage, которая возвращает тип number. Два параметра этой функции являются числами с типом number, в качестве значения второго параметра передан null.
В TOraclePackage существует семейство методов для вызова PL/SQL функций, которые возвращают значения разных типов:
CallIntegerFunction
CallStringFunction
CallFloatFunction
CallDateFunction
CallBooleanFunction
Следующий пример показывает получения значений
out переменных PL/SQL процедур и функций:
uses ... ,Oracle;
procedure test_package_out;
var P: TOraclePackage;
n: real;
s: string;
begin
P:=TOraclePackage.Create(nil);
try
P.Session:=OracleSession1;
P.CallProcedure('mypackage.proc_3',[10,parString,parInteger]);
n:=P.GetParameter(1);
s:=P.GetParameter(2);
finally
P.Free;
end;
end;
Как видно из примера для вызова PL/SQL процедуры с именем proc_3 которая содержит один in параметр и два out параметра в качестве значений out параметров передаются специальные константы, указывающие, что ожидается out параметр определенного типа. Константы могут быть parString, parInteger, parFloat, parDate, parBoolean. После выполнения PL/SQL процедуры значения out параметров считываются при помощи метода GetParameter, в который передается номер элемента массива параметров для CallProcedure. Индекс начинается с нуля.
На этом краткий обзор компонента Direct Oracle Access можно считать законченным. Мы рассмотрели использование и особенности основных компонентов DOA.
Смотрите также:
Оставьте свой комментарий
Вы должны быть авторизированны, чтобы оставить комментарий.