получить значение выходного параметра (select xxx from proc в TUniStoredProc)

Обсуждение возникших проблем, предложений и ошибок UniDAC компонентов
Akella
Сообщения: 155
Зарегистрирован: Пн 02 апр 2012 14:41

получить значение выходного параметра (select xxx from proc в TUniStoredProc)

Сообщение Akella » Ср 24 апр 2019 13:59

При попытке получить значение параметра RES поле выполнения процедуры получаю исключение, что параметра RES нет.

SP_GET_CONTACTS - TUniStoredProc.
База Firebird 3, кодировка по умолчанию UTF-8.

Код: Выделить всё

  SP_GET_CONTACTS.StoredProcName := 'SP_GET_CONTACTS';
  SP_GET_CONTACTS.SQL.Text := 'SELECT RES FROM SP_GET_CONTACTS(:ID_USER_VAR, :ID_OBJ_VAR, :ST_VAR, :ID_TELEGRAM_VAR)';
  SP_GET_CONTACTS.PrepareSQL;
  SP_GET_CONTACTS.Params[0].Clear;
  SP_GET_CONTACTS.Params[1].AsInteger := id_obj;
  SP_GET_CONTACTS.Params[2].AsInteger := supertype;
  SP_GET_CONTACTS.Params[3].AsLargeInt := id_telegram;

  try
    SP_GET_CONTACTS.ExecProc;

//ошибка здесь
    result := SP_GET_CONTACTS.ParamByName('RES').AsString;

  finally
    SP_GET_CONTACTS.Close;
  end;
Если написать запрос "SELECT :RES FROM ...", т.е. с двоеточием, то ошибка "conversion error from string":
Project raised exception class EIBCError with message 'Dynamic SQL Error
SQL error code = -303
conversion error from string "
*Ответств. агент: 7770777*"'.
Delphi Tokyo.
В настройках подключения есть: Character Set=UTF8;Use Unicode=True
Вложения
Screenshot_23.png
Screenshot_23.png (4.66 КБ) 476 просмотров

ViktorV
Devart Team
Сообщения: 189
Зарегистрирован: Чт 31 июл 2014 09:52

Re: получить значение выходного параметра (select xxx from proc в TUniStoredProc)

Сообщение ViktorV » Ср 24 апр 2019 14:34

Вам не требуется вручную устанавливать свойство TUniStoredProc.SQL.Text. Когда используется свойство TIBCStoredProc.StoredProcName и вызывается метод TIBCStoredProc.Prepare, будет автоматически построен запрос на выполнение SP.
Для решения задачи, пожалуйста, попробуйте закомментировать строку кода

Код: Выделить всё

 SP_GET_CONTACTS.SQL.Text := 'SELECT RES FROM SP_GET_CONTACTS(:ID_USER_VAR, :ID_OBJ_VAR, :ST_VAR, :ID_TELEGRAM_VAR)';

Akella
Сообщения: 155
Зарегистрирован: Пн 02 апр 2012 14:41

Re: получить значение выходного параметра (select xxx from proc в TUniStoredProc)

Сообщение Akella » Ср 24 апр 2019 14:36

На всякий случай, добавлю кусок кода SP_GET_CONTACTS

Код: Выделить всё

create or alter procedure SP_GET_CONTACTS (
    ID_USER_VAR type of column USERS.ID,
    ID_OBJ_VAR type of column APART.ID,
    ST_VAR type of column TYPES.SUPERTYPE,
    ID_TELEGRAM_VAR type of column TTELEGRAMUSERS.TELEGRAM_ID)
returns (
    RES varchar(128))
as
как видите, RES есть.
И в IDE IBExpert код выполняется без ошибок

ViktorV
Devart Team
Сообщения: 189
Зарегистрирован: Чт 31 июл 2014 09:52

Re: получить значение выходного параметра (select xxx from proc в TUniStoredProc)

Сообщение ViktorV » Ср 24 апр 2019 15:10

Akella писал(а):
Ср 24 апр 2019 14:36
На всякий случай, добавлю кусок кода SP_GET_CONTACTS

Код: Выделить всё

create or alter procedure SP_GET_CONTACTS (
    ID_USER_VAR type of column USERS.ID,
    ID_OBJ_VAR type of column APART.ID,
    ST_VAR type of column TYPES.SUPERTYPE,
    ID_TELEGRAM_VAR type of column TTELEGRAMUSERS.TELEGRAM_ID)
returns (
    RES varchar(128))
as
как видите, RES есть.
И в IDE IBExpert код выполняется без ошибок
Уточните, пожалуйста, вы пробовали предложенный нами ранее способ решения задачи?

Akella
Сообщения: 155
Зарегистрирован: Пн 02 апр 2012 14:41

Re: получить значение выходного параметра (select xxx from proc в TUniStoredProc)

Сообщение Akella » Пт 26 апр 2019 09:12

Теперь ошибка
Project exe raised exception class Exception with message 'SQL statement doesn't return rows'.

вот полный код

Код: Выделить всё

function TDM.GetContacts(id_obj, supertype: integer; id_telegram: Int64): string;
begin
  SP_GET_CONTACTS.StoredProcName := 'SP_GET_CONTACTS';
  SP_GET_CONTACTS.Prepare;
//  SP_GET_CONTACTS.SQL.Text := 'SELECT RES FROM SP_GET_CONTACTS(:ID_USER_VAR, :ID_OBJ_VAR, :ST_VAR, :ID_TELEGRAM_VAR)';
//  SP_GET_CONTACTS.PrepareSQL;
  SP_GET_CONTACTS.Params[0].Clear;
  SP_GET_CONTACTS.Params[1].AsInteger := id_obj;
  SP_GET_CONTACTS.Params[2].AsInteger := supertype;
  SP_GET_CONTACTS.Params[3].AsLargeInt := id_telegram;

  try
    //if not SP_GET_CONTACTS.Transaction.Active then SP_GET_CONTACTS.Transaction.StartTransaction;
    SP_GET_CONTACTS.Open;
    result := SP_GET_CONTACTS.FieldByName('RES').AsString;

  finally
    SP_GET_CONTACTS.Close;
  end;
end;
ошибка на строке
SP_GET_CONTACTS.Open;
Вложения
Screenshot_5.png
но одна строка там точно есть
Screenshot_5.png (5.86 КБ) 443 просмотра

ViktorV
Devart Team
Сообщения: 189
Зарегистрирован: Чт 31 июл 2014 09:52

Re: получить значение выходного параметра (select xxx from proc в TUniStoredProc)

Сообщение ViktorV » Пт 26 апр 2019 10:15

Для решения проблемы, пожалуйста, замените код:

Код: Выделить всё

    SP_GET_CONTACTS.Open;
    result := SP_GET_CONTACTS.FieldByName('RES').AsString;
на

Код: Выделить всё

    SP_GET_CONTACTS.ExecProc;
    result := SP_GET_CONTACTS.ParamByName('RES').AsString;

Akella
Сообщения: 155
Зарегистрирован: Пн 02 апр 2012 14:41

Re: получить значение выходного параметра (select xxx from proc в TUniStoredProc)

Сообщение Akella » Пт 26 апр 2019 12:15

Точно, у меня же раньше так и было: ExecProc и ParamByName.
Теперь всё работает.

Akella
Сообщения: 155
Зарегистрирован: Пн 02 апр 2012 14:41

Re: получить значение выходного параметра (select xxx from proc в TUniStoredProc)

Сообщение Akella » Пт 26 апр 2019 12:58

Точно, у меня же раньше так и было: ExecProc и ParamByName.
Теперь всё работает.

ViktorV
Devart Team
Сообщения: 189
Зарегистрирован: Чт 31 июл 2014 09:52

Re: получить значение выходного параметра (select xxx from proc в TUniStoredProc)

Сообщение ViktorV » Пт 26 апр 2019 13:00

Рады слышать, что проблема решена.
Обращайтесь к нам, если у Вас возникнут вопросы по UniDAC.

Akella
Сообщения: 155
Зарегистрирован: Пн 02 апр 2012 14:41

Re: получить значение выходного параметра (select xxx from proc в TUniStoredProc)

Сообщение Akella » Чт 02 май 2019 14:16

В продолжение теме.
На могу понять и в справке найти.

UniStoredProc.RecordCount возвращает 0, хотя в результате должно быть 10 записей.

Вижу, что IBExpert возвращает данные в виде 10ти записей.
Что нужно, чтобы в цикле обратиться ко всем записям UniStoredProc у селективной процедуры?
Спасибо.

Akella
Сообщения: 155
Зарегистрирован: Пн 02 апр 2012 14:41

Re: получить значение выходного параметра (select xxx from proc в TUniStoredProc)

Сообщение Akella » Пт 03 май 2019 07:46

тут есть кто-нибудь?

ViktorV
Devart Team
Сообщения: 189
Зарегистрирован: Чт 31 июл 2014 09:52

Re: получить значение выходного параметра (select xxx from proc в TUniStoredProc)

Сообщение ViktorV » Пт 03 май 2019 11:42

Чтобы дать вам быстрый и полный ответ на ваш вопрос, пожалуйста, составьте и вышлите нам, с помощью контактной формы https://www.devart.com/company/contactform.html, полный пример, демонстрирующий указанное вами поведение, включающий скрипты для создания и заполнения объектов БД.

Akella
Сообщения: 155
Зарегистрирован: Пн 02 апр 2012 14:41

Re: получить значение выходного параметра (select xxx from proc в TUniStoredProc)

Сообщение Akella » Пн 06 май 2019 09:16

Ссылка на скачивание примера
https://app.box.com/s/mhfsic882dv8mqzwwbdijrw54hw1vutz

Delphi Tokyo
Firebird 3
UniDAC 7.1.4

ViktorV
Devart Team
Сообщения: 189
Зарегистрирован: Чт 31 июл 2014 09:52

Re: получить значение выходного параметра (select xxx from proc в TUniStoredProc)

Сообщение ViktorV » Пн 06 май 2019 10:03

Для решения вашей задачи вы можете использовать следующий код:

Код: Выделить всё

var
  RES_ID: string;
...
  UniStoredProc.StoredProcName := 'SP_GET_DATA';
  UniStoredProc.PrepareSQL(True);
  UniStoredProc.ParamByName('PARAM_CODE').AsInteger := 0;
  UniStoredProc.ExecProc;
  while not UniStoredProc.Eof do begin
    RES_ID := UniStoredProc.FieldByName('RES_ID').AsString;
    UniStoredProc.Next;
  end;

Akella
Сообщения: 155
Зарегистрирован: Пн 02 апр 2012 14:41

Re: получить значение выходного параметра (select xxx from proc в TUniStoredProc)

Сообщение Akella » Пн 06 май 2019 10:45

Спасибо, помогло :)

Ответить