Страница 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
Спасибо, помогло :)