Обсуждение возникших проблем, предложений и ошибок ODAC компонентов
-
indapublic
- Сообщения: 21
- Зарегистрирован: Чт 17 ноя 2011 23:40
Сообщение
indapublic » Ср 11 апр 2012 04:59
Delphi XE2 Update 4
триальный Odac 8.1.6 с сайта
Код: Выделить всё
with OraStoredProc1 do
begin
StoredProcName := 'MYPROC';
Prepare;
end;
делает попытку исполнения процедуры с нулловскими параметрами. Почему?
-
Alexp
- Devart Team
- Сообщения: 349
- Зарегистрирован: Пн 27 дек 2010 10:34
Сообщение
Alexp » Ср 11 апр 2012 08:57
Добрый день,
Вызов метода prepare вызывает и анализирует процедуру на сервере для повышения производительности.
-
indapublic
- Сообщения: 21
- Зарегистрирован: Чт 17 ноя 2011 23:40
Сообщение
indapublic » Ср 11 апр 2012 09:36
Alexp писал(а):Добрый день,
Вызов метода prepare вызывает и анализирует процедуру на сервере для повышения производительности.
Но этого поведения не было ранее (в младших версиях) или я упустил это?
Вызов с нулловыми параметрами недопустим - стоит отказаться от Prepare?
-
Alexp
- Devart Team
- Сообщения: 349
- Зарегистрирован: Пн 27 дек 2010 10:34
Сообщение
Alexp » Ср 11 апр 2012 11:04
Hello,
При вызове метода Prepare вызывается метод OCIStmtPrepare из библиотеки OCI.dll который "подготавливает" процедуру на сервере, и "явного" вызова процедуры не происходит - поэтому проблем с использованием метода prepare возникнуть не должно. Если у Вас возникают проблемы с использованием этого метода пришлите пожалуйста скрипт для создания Вашей ХП и объектов БД используемых в ней, а также точные версии ODAC и IDE
-
indapublic
- Сообщения: 21
- Зарегистрирован: Чт 17 ноя 2011 23:40
Сообщение
indapublic » Ср 11 апр 2012 13:23
Функция PL/SQL
Код: Выделить всё
CREATE OR REPLACE
FUNCTION connect_as (p_SUBLOGIN VARCHAR2, p_CERT VARCHAR2, p_PWD VARCHAR2, p_ID_SESSION VARCHAR2 default NULL) return SYS_REFCURSOR is
begin
if p_SUBLOGIN is null or p_CERT is null then
RAISE_APPLICATION_ERROR(-20000, 'Ошибка вызова');
end if;
end;
Код Delphi
Код: Выделить всё
with OraSession1 do
begin
ConnectPrompt := False;
Username := 'TEST';
Password := 'test';
Server := 'NK00';
Schema := 'TEST';
Connect;
end;
with OraStoredProc1 do
begin
StoredProcName := 'CONNECT_AS';
Prepare;
end;
Версия БД
Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - 64bit
Версия ODAC
8.1.6 for Delphi XE2 Trial Edition
Версия RAD
Embarcadero® RAD Studio XE2 Version 16.0.4429.46931
-
indapublic
- Сообщения: 21
- Зарегистрирован: Чт 17 ноя 2011 23:40
Сообщение
indapublic » Ср 11 апр 2012 13:29
Методом проб выяснено:
1. Если сменить тип RESULT с курсора на любой другой - все хорошо.
2. Если пробовать OraSession1.ExecProc - тоже все хорошо. Так как исходных кодов нет - узнать что в теле ExecProc я не могу
-
Alexp
- Devart Team
- Сообщения: 349
- Зарегистрирован: Пн 27 дек 2010 10:34
Сообщение
Alexp » Ср 11 апр 2012 15:54
Hello,
Метод ExecProc введен для совместимости с BDE и внутри себя вызывает метод Execute, в обоих случаях происходит явное выполнение процедуры. При Вызове метода Prepare если параметром процедуры являеться курсор мы пытаемся получить его поля с помощью "неявного" вызова этой процедуры со значением параметров равным NULL. Если Вам необходимо получать только параметры "простых" типов не SYS_REFCURSOR то Вы можете использовать метод PrepareSQL который не будет вызывать выполнение процедуры.