Страница 1 из 2

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

Добавлено: Ср 24 апр 2019 13:59
Akella
При попытке получить значение параметра 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

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

Добавлено: Ср 24 апр 2019 14:34
ViktorV
Вам не требуется вручную устанавливать свойство 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)';

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

Добавлено: Ср 24 апр 2019 14:36
Akella
На всякий случай, добавлю кусок кода 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 код выполняется без ошибок

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

Добавлено: Ср 24 апр 2019 15:10
ViktorV
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 код выполняется без ошибок
Уточните, пожалуйста, вы пробовали предложенный нами ранее способ решения задачи?

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

Добавлено: Пт 26 апр 2019 09:12
Akella
Теперь ошибка
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;

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

Добавлено: Пт 26 апр 2019 10:15
ViktorV
Для решения проблемы, пожалуйста, замените код:

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

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

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

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

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

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

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

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

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

Добавлено: Пт 26 апр 2019 13:00
ViktorV
Рады слышать, что проблема решена.
Обращайтесь к нам, если у Вас возникнут вопросы по UniDAC.

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

Добавлено: Чт 02 май 2019 14:16
Akella
В продолжение теме.
На могу понять и в справке найти.

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

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

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

Добавлено: Пт 03 май 2019 07:46
Akella
тут есть кто-нибудь?

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

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

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

Добавлено: Пн 06 май 2019 09:16
Akella
Ссылка на скачивание примера
https://app.box.com/s/mhfsic882dv8mqzwwbdijrw54hw1vutz

Delphi Tokyo
Firebird 3
UniDAC 7.1.4

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

Добавлено: Пн 06 май 2019 10:03
ViktorV
Для решения вашей задачи вы можете использовать следующий код:

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

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;

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

Добавлено: Пн 06 май 2019 10:45
Akella
Спасибо, помогло :)