TOraStoredProc.Prepare

Обсуждение возникших проблем, предложений и ошибок ODAC компонентов
Закрыто
indapublic
Сообщения: 21
Зарегистрирован: Чт 17 ноя 2011 23:40

TOraStoredProc.Prepare

Сообщение 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 который не будет вызывать выполнение процедуры.

Закрыто