• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Delphi, Firebird, Procedure

  • Автор темы crossmark
  • Дата начала
C

crossmark

Привет!
Столкнулся с такой проблемой... как только не пробовал... только не так как надо.
не могу получить выходные параметры из хранимой процедуры бд на Firebird/
сама процедура в IBExpert работает: вот код
Код:
Код:
create or alter procedure PR_READ_DATA_PERS (
TAB_PERS integer)
returns (
R_TAB_PERS integer,
R_FAM_PERS varchar(30),
R_NAME_PERS varchar(30),
R_LAST_NAME_PERS varchar(30),
R_TOWN_PERS varchar(30),
R_STREET_PERS varchar(30),
R_HOUSE_PERS varchar(10),
R_KVART_PERS varchar(10),
R_BIRTH_PERS date,
R_KOLONA_PERS smallint,
R_POST_PERS integer,
R_MOTION_PERS integer,
R_KLASS_PERS smallint,
R_TRACT_PERS integer,
R_DATE_PERS date)
as
begin
select PERSONAL.p_tab, PERSONAL.P_FAMILY, PERSONAL.P_NAME, PERSONAL.P_LASTNAME,
PERSONAL_DATA.PD_TOWN, PERSONAL_DATA.PD_STREET, PERSONAL_DATA.PD_HOUSE,personal_data.pd_kvart,
PERSONAL_DATA.P_BIRTH, PERSONAL_DATA2.PD_KOLONA, personal_data2.pd_post,
personal_data2.pd_motion, PERSONAL_DATA2.PD_KLASS, personal_data2.pd_traction, PERSONAL_DATA2.PD_DATE
from personal,personal_data,personal_data2
where (personal.p_tab=:Tab_pers) and (personal_data.pd_tab=:tab_pers) and (personal_data2.pd_tab=:tab_pers)
into :R_TAB_PERS, :R_FAM_PERS,:R_NAME_PERS,:R_LAST_NAME_PERS,:R_TOWN _PERS,:R_STREET_PERS,:R_HOUSE_PERS,:R_KVART_PERS,: R_BIRTH_PERS,:r_kolona_pers,:R_POST_PERS,:r_motion _pers,:r_klass_pers,:R_TRACT_PERS,:r_date_pers;
end
Тут, занчаит один входящий парметр и ряд выходящик параметров.

на делфи пробую вызов так:
Код:
Код:
StoredProcReadPersProc.Active;
StoredProcReadPersProc.StoredProcName:='PR_READ_DA TA_PERS';
StoredProcReadPersProc.Params.Add;
StoredProcReadPersProc.Params.Items[0].Name:= 'TAB_PERS';
//StoredProcReadPersProc.Params[0].AsInteger:=QueryViewPers.FieldByName('P_TAB').A sI nteger;
StoredProcReadPersProc.Params.ParamValues['TAB_PERS']:= QueryViewPers.FieldByName('P_TAB').AsInteger;
StoredProcReadPersProc.Params.Add;
StoredProcReadPersProc.Params.Items[1].Name:='R_FAM_PERS';
showmessage(StoredProcReadPersProc.ParamByName('TA B_PERS').AsString);
StoredProcReadPersProc.Prepare;
StoredProcReadPersProc.ExecProc;

//StoredProcReadPersProc.Params.AddParam(
s:=StoredProcReadPersProc.ParamByName('R_FAM_PERS' ).Value;
showmessage(s);
как получить все эти выходные параметры...?

спасибо!
 
S

sinkopa

как получить все эти выходные параметры...?
спасибо!
Да оттуда же, из StoredProcReadPersProc.Params :)
Я вот не поленился (в отличие от Вас) заглянуть в исходники и посмотреть что делает StoredProcReadPersProc.ExecProc;

Код:
procedure TIBStoredProc.ExecProc;
var
DidActivate: Boolean;
begin
CheckInActive;
if StoredProcName = '' then
IBError(ibxeNoStoredProcName, [nil]);
ActivateConnection;
DidActivate := ActivateTransaction;
try
SetPrepared(True);
if DataSource <> nil then
SetParamsFromCursor;
if FParams.Count > 0 then
SetParams;				 // 1. Генерируется SQL запрос
InternalExecQuery;		  // 2. Выполняется SQL запрос
FetchDataIntoOutputParams;  // 3. Результаты SQL запроса выливаются в Params (см код процедуры ниже)
SetPrepared(false); 
finally
if DidActivate then
DeactivateTransaction;
end;
end;

//...
procedure TIBStoredProc.FetchDataIntoOutputParams;
var
i,j : Integer;
begin
j := 0;
for i := 0 to FParams.Count - 1 do					 // Пробежка по списку свойства Params 
with Params[I] do									// и если параметр выходной (ParamType = ptOutput) в него "выливается" то что вернул SQL запрос
if ParamType = ptOutput then begin
Value := QSelect.Fields[j].Value;
Inc(j);
end;
end;
Зачем Вы Вот это делаете?
Код:
StoredProcReadPersProc.Params.Add;
StoredProcReadPersProc.Params.Items[0].Name:= 'TAB_PERS';
StoredProcReadPersProc.Params[0].AsInteger:=QueryViewPers.FieldByName('P_TAB').A sI nteger;
Ведь все выходные параметры у Вас уже описаны в процедуре, в секции TAB_PERS ->returns и соответственно уже добавлены после
Код:
StoredProcReadPersProc.StoredProcName:='PR_READ_DA TA_PERS';
Проверьте значение StoredProcReadPersProc.Params.Count до и после назначения имени процедуры и убедитесь... :)
 
C

crossmark

спасибо большое. !!!!!
это не лень. это еще не совсем знания. в другой раз буду сначала там смотреть

спасибо за урок!!!!!
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!