UniStoredProc - получить значение выходного параметра

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

UniStoredProc - получить значение выходного параметра

Сообщение Akella » Вс 15 июл 2012 08:36

Как с помощью UniDAC (TUniStoredProc и/или TUniSQL) выполнить хранимую процедуру на сервере и получить результат выходного параметра?
Почитал справку в разделе "Executing Stored Procedures", там написано, что поддерживает все типы параметров, но нет примеров, и нет больше информации.

Текст самой процедуры

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

PROCEDURE kvartal_prem.sp_add_report_by_id(IN p_id INT, OUT out_id INT)
  COMMENT 'создать отчет на основе существующего'
BEGIN

  CREATE TEMPORARY TABLE temp1 AS SELECT *
                                  FROM
                                    kvartal_prem.tReports
                                  WHERE
                                    id = @p_id;

INSERT INTO kvartal_prem.tReports (name, remark, report, dotmatrix)
  SELECT name
       , remark
       , report
       , dotmatrix
  FROM
    temp1
  WHERE
    temp1.id = @p_id;

  SET @out_id = LAST_INSERT_ID();

DROP TABLE temp1;
END

Мне нужно на клиенте получить значение параметра out_id

Выполняю на клиенте:

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

  sp_add_report_by_id.ParamByName('p_id').AsInteger := id1;
  sp_add_report_by_id.ExecProc;
  out1 := sp_add_report_by_id.ParamByName('out_id').AsInteger;
Но возвращается 0 (ноль)

Как правильно?
Спасибо

AndreyZ
Devart Team
Сообщения: 328
Зарегистрирован: Чт 08 сен 2011 13:18

Re: UniStoredProc - получить значение выходного параметра

Сообщение AndreyZ » Пн 16 июл 2012 10:35

Здравствуйте,

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

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

UniQuery.SQL.Clear;
UniQuery.SQL.Add('INSERT INTO kvartal_prem.tReports (name, remark, report, dotmatrix)');
UniQuery.SQL.Add('SELECT name, remark, report, dotmatrix from kvartal_prem.tReports');
UniQuery.SQL.Add('WHERE id=:id');
UniQuery.ParamByName('id').AsInteger := id;
UniQuery.Execute;
ShowMessage(IntToStr(UniQuery.LastInsertId)); // LastInsertId используется для MySQL и PostgreSQL серверов для получения значения автоинкремент полей после выполнения INSERT запроса.
Если Вы хотите использовать хранимую процедуру, то Вы можете использовать следующую хранимую процедуру:

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

CREATE DEFINER = 'root'@'%'
PROCEDURE kvartal_prem.InstReports(IN pid INT, OUT poutid INT)
BEGIN
  INSERT INTO kvartal_prem.tReports (name, remark, report, dotmatrix)
  SELECT name, remark, report, dotmatrix from kvartal_prem.tReports
  WHERE id=pid;
  SET poutid = LAST_INSERT_ID();
END
, и следующий код:

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

UniStoredProc.StoredProcName := 'InstReports';
UniStoredProc.PrepareSQL;
UniStoredProc.ParamByName('pid').AsInteger := id;
UniStoredProc.Execute;
ShowMessage(IntToStr(UniStoredProc.ParamByName('poutid').AsInteger));

Закрыто