MySQL 5.5.32-проблема получения данных из хранимой процедуры

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

MySQL 5.5.32-проблема получения данных из хранимой процедуры

Сообщение Jura » 21.07.2013 21:38:16

Добрый вечер.
Исходные данные:
Сервер MySQL 5.5.32 (localhost)
OS: Windows XP SP3
Lazarus-1.1-42165-fpc-2.7.1-20130721-win32
MySQL Workbench 5.2 CE
Перепахал уже весь Инет. Проблема в следующем - не могу понять как получить данные из хранимой процедуры (чисто теоретические исследования, для себя ).
Код хранимой процедуры:
Код: Выделить всё
-- --------------------------------------------------------------------------------
-- Routine DDL
-- Note: comments before and after the routine body will not be stored by the server
-- --------------------------------------------------------------------------------
DELIMITER $$

CREATE PROCEDURE `trm`.`trm_login_user` (in login varchar(100),
  in pass varchar(100),
  out result_login varchar(15))

BEGIN

declare count_result integer default 0;

   select COUNT(*) into count_result from trm_users where name = login and password = pass;
    if count_result = 1 then
      set result_login = 'yes';
    else 
      set result_login = 'no';
    end if;

END


В Lazarus создана форма , на ней

mysql1.jpg



По кнопке вызывается следующая процедура:
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var str_login:String;
begin
         SQLQuery1.ExecSQL;

          str_login:= SQLQuery1.ParamByName('@l').Value;
          ShowMessage('Возвращаемое значение - '+str_login);

          SQLQuery1.Active:=false;
end;


Соединение с базой данных есть. Транзакция в активном режиме. Даю простой SQL запрос (типа select) при нажатии на кнопку - всё работает. Данные в грид выводятся. Если вписываю запрос, который кстати работает в MySQL Workbench 5.2 CE так как надо,

Код: Выделить всё
call trm_login_user('Turov','0',@l);
select @l;


Lazarus выдает ошибку

mysql2.jpg


Если этот запрос вставить в редактор SQL(Lazarus) и запустить на выполнение, то выводится следующая ошибка

mysql3.jpg


Т.к. программист из меня еще тот, вот и прошу помощи у знающих людей. Заранее спасибо
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Jura
незнакомец
 
Сообщения: 7
Зарегистрирован: 24.12.2009 17:18:16
Откуда: Новосибирск

Re: MySQL 5.5.32-проблема получения данных из хранимой проце

Сообщение Vapaamies » 22.07.2013 01:22:45

Мне кажется, что строчка "select @1" нужна только в диалоговой среде, умеющей работать только с результатами запросов. При программном доступе, когда есть возможность прямого чтения параметров, строчка не нужна.

К тому же, насколько понимаю, обычные компоненты запроса не выносят точек с запятой, поскольку рассчитаны строго на одну команду SQL. Исключение -- компоненты, в названии которых есть слово "Script", -- явно не ваш случай.
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург

Re: MySQL 5.5.32-проблема получения данных из хранимой проце

Сообщение Jura » 22.07.2013 05:42:50

Спасибо за ответ. А не могли бы Вы показать пример кода для получения результатов хранимой процедуры или хотя бы где искать информацию. Просто по данной теме я уже все форумы обошел - результат почти нулевой.
Аватара пользователя
Jura
незнакомец
 
Сообщения: 7
Зарегистрирован: 24.12.2009 17:18:16
Откуда: Новосибирск

Re: MySQL 5.5.32-проблема получения данных из хранимой проце

Сообщение Vapaamies » 22.07.2013 06:12:28

В нормальных компонентах параметры обычно предваряются двоеточием в тексте команды:
Код: Выделить всё
call trm_login_user('Turov','0',:l);

Если используемых вами компонентах принято то же соглашение, должно сработать. Возможно, придется дополнительно указать в свойствах параметра, что он является out-параметром.

После выполнения процедуры полученное значение должно считаться через обычный ParamByName('l') или даже Params[0]. Это мои предположения, основанные на опыте Delphi.

Jura писал(а):или хотя бы где искать информацию.

Если перед использованием Lazarus не писать много лет на Delphi, боюсь, придется искать вменяемые учебники по работе с БД в Delphi и учиться по ним, адаптируя прочитанное к Lazarus собственными силами. При этом важно понимать суть, для чего нужен учебник объясняющий именно суть, а не куда какой компонент бросить. Сам учился давно, конкретный учебник посоветовать не могу.

Непосредственно по MySQL можно позаимствовать справку каких-либо коммерческих компонентов (того же MyDAC), адаптируя описанное к аналогам из Lazarus как и в случае с учебником, и обращаясь к API, когда уровня компонентов уже недостаточно. В случае Delphi я обычно советую смотреть также исходники компонентов, если они доступны, но исходники FPC/Lazarus не могу понять сам. Заглядывайте в них на собственный страх и риск, авось что-то поймете.
Последний раз редактировалось Vapaamies 22.07.2013 22:13:16, всего редактировалось 1 раз.
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург

Re: MySQL 5.5.32-проблема получения данных из хранимой проце

Сообщение Jura » 22.07.2013 06:47:22

Понял. Спасибо за ответ и наводку. Буду копать дальше. По результатам отпишусь

Добавлено спустя 3 часа 40 минут 17 секунд:
Re: MySQL 5.5.32-проблема получения данных из хранимой процедуры
Решение найдено.. Спасибо за советы Vapaamies.

Код: Выделить всё
     MySQL55Connection1.Connected:=true;
     SQLTransaction1.Active:=true;
         SQLQuery1.SQL.Add('call trm_login_user(:login,:pass,@result_login);');
         SQLQuery1.Prepare;

         SQLQuery1.Params.Clear;
         SQLQuery1.Params.CreateParam(ftString, 'login', ptInput);
         SQLQuery1.Params.CreateParam(ftString, 'pass', ptInput);

         SQLQuery1.Params.ParamByName('login').AsString:= 'Turov';
         SQLQuery1.Params.ParamByName('pass').AsString:= '0';
         SQLQuery1.ExecSQL;
         SQLQuery1.SQL.Clear;
         SQLQuery1.SQL.Add('select @result_login');
         SQLQuery1.Open;

         str_login:= SQLQuery1.fields[0].asstring;
         ShowMessage('Возвращаемое значение - '+str_login);   


И писать надо именно так - @result_login (это, как я понял, возвращаемый параметр (OUT)). Если ставить :result_login, то приложение вываливается в ошибку.

Помогла следующая ссылка http://www.sql.ru/forum/748169/problema-s-vozvratom-znacheniya-iz-hranimoy-procedury-mysql-v-delphi
Тему можно закрывать.
Аватара пользователя
Jura
незнакомец
 
Сообщения: 7
Зарегистрирован: 24.12.2009 17:18:16
Откуда: Новосибирск


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: mike и гости: 248

Рейтинг@Mail.ru