Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.06.2010, 13:11   #1
superpyct
 
Регистрация: 24.09.2009
Сообщений: 4
Вопрос Не возвращается результат функции при использовании типа параметра ptResult

Трехзвенное приложение, используется MIDAS.
БД Oracle 9.2.0.7, ODAC 6.80

На сервере БД вызывается функция:
Код:
CREATE OR REPLACE FUNCTION get_test_result (param IN NUMBER)
    RETURN VARCHAR2
IS
    l_ret_val   VARCHAR2 (100);
BEGIN
    l_ret_val := 'Входной параметр - ' || TO_CHAR (param);
    RETURN l_ret_val;
END get_test_result;
/
На сервере приложений:
Код:
TOraSession (OS) -> TOraStoredProc (OSP) -> TDataSetProvider (DSP)

OSP.StoredProcName := GET_TEST_RESULT;
На клиенте:
Код:
TSocketConnection (SC) -> TClientDataSet (CDS)
Пример вызова функции на клиенте:
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
  with CDS do
   begin
    RemoteServer := SC;
    ProviderName := 'DSP';
    Params.Clear;
    Params.CreateParam(ftString,'RESULT',ptOutput);
    Params.CreateParam(ftFloat,'PARAM',ptInput).AsInteger := 123;
    Execute;
    ShowMessage(Params.ParamByName('RESULT').AsString);
   end;
end;
После перехода с ODAC-5.10 на ODAC-6.7 появилась проблема:
1) Если при создании параметра RESULT указать тип ptOutput то при вызове возникнет ошибка 'Ошибочное число или типы аргументов ...' т.к. при обращении к серверу формируется строка
Код:
   begin
    GET_TEST_RESULT(:RESULT, :PARAM);
   end;
2) Если при создании параметра RESULT указать тип ptResult выполняется нормально, формируется правильная строка при обращении к серверу
Код:
   begin
     :RESULT := GET_TEST_RESULT(:PARAM);
   end;
Но после выполнения при обращении к параметру RESULT
как написано выше
Код:
 ShowMessage(Params.ParamByName('RESULT').AsString);
значение пусто.

Я нашел не очень элегантный вариант обхода:
на сервере приложений вызывается процедура

Код:
procedure TServer2007.PurpStoreProc(const STName: WideString);
 var s: string;
begin
  FPurpStoreProc.StoredProcName :='';
  FPurpStoreProc.StoredProcName := STName;
  FPurpStoreProc.PrepareSQL;
  s := FPurpStoreProc.SQL.Text;
  FPurpStoreProc.SQL.Text := s;
end;
Код вызова процедуры на клиенте:
Код:
 SC.AppServer.PurpStoreProc(GET_TEST_RESULT);
После чего код обработчика приобретает вид:
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
  with CDS do
   begin
    RemoteServer := SC;
    ProviderName := 'DSP';
    Params.Clear;
    SC.AppServer.PurpStoreProc(GET_TEST_RESULT);
    Params.CreateParam(ftString,'RESULT',ptOutput);
    Params.CreateParam(ftFloat,'PARAM',ptInput).AsInteger := 123;
    Execute;
    ShowMessage(Params.ParamByName('RESULT').AsString);
   end;
end;
Подскажите пожалуйста, существует ли более элегантное решение проблемы?

Последний раз редактировалось Stilet; 09.06.2010 в 13:27.
superpyct вне форума Ответить с цитированием
Старый 09.06.2010, 13:30   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Задача вернуть из функции результ?
Попробуй использовать запрос
Код:
Select * from get_test_result(тут типа параметр) from dual
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.06.2010, 14:31   #3
superpyct
 
Регистрация: 24.09.2009
Сообщений: 4
По умолчанию

SELECT get_test_result(здесь значение) from dual
как еще один способ...

Больше интересует вопрос, почему при использовании ptResult сервер приложений не передает клиенту значение, полученное от функции БД.
superpyct вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
in Формула типа String out результат типа Double Gypsy Общие вопросы Delphi 3 16.04.2010 10:21
Как создать функцию, которая возвращает результат - строку типа ansistring. atg C++ Builder 2 28.10.2009 18:20
Как узнать возвращается ли чему либо результат из функции? Stilet Общие вопросы Delphi 7 07.10.2009 16:45
Передача функции как параметра ezus Общие вопросы C/C++ 2 24.08.2009 10:19
Функции. Передача массива в качестве параметра функции. Wia Помощь студентам 2 17.03.2009 14:57