Delphi, Firebird, Procedure

Тема в разделе "Delphi - Базы данных", создана пользователем crossmark, 29 дек 2011.

  1. crossmark

    crossmark Гость

    Привет!
    Столкнулся с такой проблемой... как только не пробовал... только не так как надо.
    не могу получить выходные параметры из хранимой процедуры бд на Firebird/
    сама процедура в IBExpert работает: вот код
    Код:
    Код (Text):
    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
    Тут, занчаит один входящий парметр и ряд выходящик параметров.

    на делфи пробую вызов так:
    Код:
    Код (Text):
    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);
    как получить все эти выходные параметры...?

    спасибо!
     
  2. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Да оттуда же, из StoredProcReadPersProc.Params :)
    Я вот не поленился (в отличие от Вас) заглянуть в исходники и посмотреть что делает StoredProcReadPersProc.ExecProc;

    Код (Delphi):
    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;
    Зачем Вы Вот это делаете?
    Код (Delphi):
    StoredProcReadPersProc.Params.Add;
    StoredProcReadPersProc.Params.Items[0].Name:= 'TAB_PERS';
    StoredProcReadPersProc.Params[0].AsInteger:=QueryViewPers.FieldByName('P_TAB').A sI nteger;
    Ведь все выходные параметры у Вас уже описаны в процедуре, в секции TAB_PERS ->returns и соответственно уже добавлены после
    Код (Delphi):
    StoredProcReadPersProc.StoredProcName:='PR_READ_DA TA_PERS';
    Проверьте значение StoredProcReadPersProc.Params.Count до и после назначения имени процедуры и убедитесь... :)
     
  3. crossmark

    crossmark Гость

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

    спасибо за урок!!!!!
     
Загрузка...
Похожие Темы - Delphi Firebird Procedure
  1. acorn
    Ответов:
    6
    Просмотров:
    8.236
  2. cybert
    Ответов:
    0
    Просмотров:
    91
  3. Shouldercannon
    Ответов:
    0
    Просмотров:
    152
  4. antares
    Ответов:
    0
    Просмотров:
    434
  5. Луиза
    Ответов:
    0
    Просмотров:
    294

Поделиться этой страницей