Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




MySQL.RU - Webboard



Вернуться
Множественый выбор из хранимой процедуры (Bogdan_Dima) 10/02/2009 - 14:54:06
      Re: Множественый выбор из хранимой процедуры (vfvtnjd) 30/11/2011 - 12:00:55



From: Bogdan_Dima - 10/02/2009 - 14:54:06
Subject:Множественый выбор из хранимой процедуры
-----------------
Работаю со следующей связкой delphi7 + mysql5 + zeos 6.6.4 выбираю данные в delphi при помощи хранимых процедур и
возник следующий вопрос.
Для выборки одиночных данных разобрался получается такой код

таблица people

id_people| surname | name |
0 | Иванов | Иван |
1 | Петров | Петр |
2 | Артемов | Артем |

хранимая процедура:

Допустим для получения общего количества людей

CREATE DEFINER=`root`@`%` PROCEDURE `proc_count`(In param1 TEXT, Out res text)
BEGIN
SELECT count(*) INTO res FROM `people`;
END


Вот выборка в delphi

procedure TMainForm.Button6Click(Sender: TObject);
var LQuery: TZQuery;
res:string;
begin
LQuery:=TZQuery.Create(self);
With LQuery do
begin
Connection:=DataModule6.ZConnection1;
SQL.Text:='call proc_count(:p1, @v)';
ShowMessage(LQuery.SQL.Text);
ExecSQL;
SQL.Text:='select @v';
open;
res:=(FieldByName('@v').Value);
Edit_Count_People.Text:=res;
end;
end;

А вот как быть если множественная выборка допустим для выборки всех фамилий

CREATE DEFINER=`root`@`%` PROCEDURE `all_surname`(In param1 TEXT, Out res text, Out kol text)
BEGIN
SELECT Count(Surname) Into kol FROM `people`;
SELECT Surname INTO res FROM `people`;
END


Как выбрать их в delphi допустим все значения записать в тот же edit.text?
если бы был аналог php mysql_fetch_array то было бы замечательно а тут даже не знаю

procedure TMainForm.Button6Click(Sender: TObject);
var LQuery: TZQuery;
//Наверно следует сделать массив для будущей выборки
res:array [0..100] of string; //хотя в принципе лучше использовать динамический массив но в примере не столь важно
i,kolich:integer;
begin
LQuery:=TZQuery.Create(self);
With LQuery do
begin
Connection:=DataModule6.ZConnection1;
SQL.Text:='call all_surname(:p1, @v, @kol)';
ShowMessage(LQuery.SQL.Text);
open //кстати я так понял что при выборке нужно использовать open а в запросах не возвращающих данные используется разъясните так или не так ExecSQL;

SQL.Text:='select @kol';//для того чтобы узнать количество записей
open;
kolich:=strtoint(FieldByName('@kol').Value);
close;// вопрос надо или нет

SQL.Text:='select @v';//для того чтобы выбрать фамилии
open;
//теперь запустить цикл и заполнить массив
for i:=0 to kolich do
begin
res[i]:=(FieldByName('@v').Value); // вот здесь как то не так делать надо потому что получается что
я пытаюсь всю выборку в каждый элемент запихнуть. Соответственно выдается ошибка что выбрано больше одной записи
Edit_Select_People.Text:=Edit_Select_People.Text+' '+res[i];
end;
end;
end;


В php проще
$Result:=mysql_query('Select * from People');

while ($Row = mysql_fetch_array ($Result))
{
echo "$Row['name']";
echo "$Row['surname']";
}

а как в delphi чего-то не догадаюсь никак


[Это сообщение - спам!]

Последние сообщения из форума

Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
40774



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |