







|
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,
версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
40774
|
|