Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Многократный вызов процедуры / 10 сообщений из 10, страница 1 из 1
20.06.2015, 16:25:50
    #38988923
comtehno
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многократный вызов процедуры
Доброго дня! Господа, не могу понять в чем трабла, в mysql имеется процедура вызова справочника
Код: sql
1.
2.
3.
4.
5.
6.
delimiter //
create procedure get_spr(per_header integer) language sql deterministic
begin
	select code as id, name as name from note_bodys where header = per_header and status=1;
end//
delimiter ;


теперь в delphi делаю заполнение комбобоксов значением справочников
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
  frmAMTEdit                         := TfrmAMTEdit.Create(Application);
  frmAMTEdit.Position                := poScreenCenter;
  frmAMTEdit.FormStyle               := fsStayOnTop;
  frmAMTEdit.qwAMT_TYPE              := TZQuery.Create(Application);
  frmAMTEdit.qwAMT_TYPE.Active       := False;
  frmAMTEdit.qwAMT_TYPE.Connection   := frmMain.mysql;
  frmAMTEdit.qwAMT_TYPE.SQL.Clear;
  frmAMTEdit.qwAMT_TYPE.SQL.Add('call get_spr(10);');
  frmAMTEdit.qwAMT_TYPE.Active       := True;
  frmAMTEdit.dsAMT_TYPE              := TDataSource.Create(Application);
  frmAMTEdit.dsAMT_TYPE.DataSet      := frmAMTEdit.qwAMT_TYPE;
  frmAMTEdit.cbAMT_TYPE.ListSource   := frmAMTEdit.dsAMT_TYPE;
  frmAMTEdit.cbAMT_TYPE.KeyField     := 'id';
  frmAMTEdit.cbAMT_TYPE.ListField    := 'name';
  frmAMTEdit.qwAMT_MODEL             := TZQuery.Create(Application);
  frmAMTEdit.qwAMT_MODEL.Active      := False;
  frmAMTEdit.qwAMT_MODEL.Connection  := frmMain.mysql;
  frmAMTEdit.qwAMT_MODEL.SQL.Clear;
  frmAMTEdit.qwAMT_MODEL.SQL.Add('call get_spr(9);');
  frmAMTEdit.qwAMT_MODEL.Active      := True;
  frmAMTEdit.dsAMT_MODEL             := TDataSource.Create(Application);
  frmAMTEdit.dsAMT_MODEL.DataSet     := frmAMTEdit.qwAMT_MODEL;
  frmAMTEdit.cbAMT_MODEL.ListSource  := frmAMTEdit.dsAMT_MODEL;
  frmAMTEdit.cbAMT_MODEL.KeyField    := 'id';
  frmAMTEdit.cbAMT_MODEL.ListField   := 'name';


Код работает до второго вызова 'call get_spr', в чем трабла, как я понимаю, что это не проблема delphi, а что-то в mysql, не могу понять в чем дело, подскажите где рыть?
...
Рейтинг: 0 / 0
20.06.2015, 16:38:47
    #38988929
comtehno
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многократный вызов процедуры
Забыл сказать, что ошибка delphi следующая SQLError: commands not sync; you can`t run this command now. Не понимаю, что я сделал не так.
...
Рейтинг: 0 / 0
20.06.2015, 17:09:14
    #38988941
comtehno
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многократный вызов процедуры
Как я понимаю, проблема в том, что результат 'call get_spr(x)' возвращает несколько записей, как бороться с этой ситуацией?
...
Рейтинг: 0 / 0
20.06.2015, 17:17:03
    #38988944
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многократный вызов процедуры
Не, а MySQL-то тут при чём? К нему какие претензии? Он честно отдал всё, что с него запросили.
Со своей Дельфой разбирайтесь, какого она не может разобраться в записях.
...
Рейтинг: 0 / 0
20.06.2015, 17:56:56
    #38988954
comtehno
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многократный вызов процедуры
Akina,

Да согласен, mysql не причем, но самое смешное, что по моему способу, в первый комбик данные все подставляются, а что поисходит потом, не пойму. :)
...
Рейтинг: 0 / 0
20.06.2015, 19:43:56
    #38988967
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многократный вызов процедуры
comtehno,

Сколько записей должен вернуть Мускуль?
Сколько записей принимается в Дельфи после первого запроса?
... ничего не "осталось" в буферах Дельфи, что может блокировать следующий вызов?
.. может выгребать надо "циклом" или "в массив"?
...
Рейтинг: 0 / 0
20.06.2015, 22:13:17
    #38989003
comtehno
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многократный вызов процедуры
Arhat109comtehno,

1. (Сколько записей должен вернуть Мускуль?) В каждом справочнике разное количество записей от 1 до бесконечности.
2. (Сколько записей принимается в Дельфи после первого запроса?) Ну в частности в моем случает в первый комбик загружается 5 записей. Во-второй 4 записи.
3. ... ничего не "осталось" в буферах Дельфи, что может блокировать следующий вызов? Дело в том, что у меня на каждый комбик свой zquery, так что как я понимаю ничего в буфере висеть не должно, я гружу на компонент - что он с рекордсетами работает некорректно.
4. (.. может выгребать надо "циклом" или "в массив"?) Насчет этого думаю.
...
Рейтинг: 0 / 0
21.06.2015, 09:44:12
    #38989087
Arhat109
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многократный вызов процедуры
comtehno,

Я не знаю, как в вашем случае, но году так в 2009-м слегка общался с Дельфи и Интербейзом... такм была похожая засада, которая упиралась в драйвер СУБД. Сейчас уже детали не вспомню, но вам скорее всего надо на дельфийский форум, а не тут.
...
Рейтинг: 0 / 0
22.06.2015, 13:53:20
    #38989645
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многократный вызов процедуры
comtehnoЗабыл сказать, что ошибка delphi следующая SQLError: commands not sync; you can`t run this command now. Не понимаю, что я сделал не так.

Курсоры (запросы) закрывать надо после фетча.
после .open() запроса надо делать .close().
...
Рейтинг: 0 / 0
27.06.2015, 20:17:56
    #38994349
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многократный вызов процедуры
чтото вы все плохо с мусклом работаете. на пхп будет тоже самое(даже в Yii) в тупую делая подобное получите тоже самое.

я не работал на делфи с ТЗ квери, поэтому автор исчи сам... НО

подобная функция(процедура) возвращает два результата - первый результат это селект который сработал внутри неё, второй - это сам результат запуска функции.

на пхп , если написать чтото типо как вы на делфи
-результат- = запрос.выполнить().получить_результат() ( - второе возможно автоматически)
выдаст именно первый результат, но остаёться второй, и пока он остаёться, на этом соединении!!!!!!!
для тех кто считает что мускл ни причом, на это соединении нельзя посылать вторую команду(почему ошибка и звучит асинхроность - ибо даные идут от мускла к клиенту, первый результат прошол, второй ожидает)

вообщем толджы быть функции аля freeResult - очистка всех результатов и можно следующую команду выполнять
и функции для просмотра всех результатов аля isNextResult next getResult
типо логика такая, пока есчё !!!! НА СОЕДИНЕНИИ имеються не прочитанные результаты с сервера, смещаем курсор на следующий и читаем его

тоесть на псевдокоде для вас будет либо

queryObject.freeResult();

либо

while(queryObject.isNextResult())
begin
if queryObject.next() then begin
result := queryObject.getResult();
//process current result

end
else
// critical section .....wait
end


end;

критической ситуации поидее быть не должно, ибо это ипостась кода более глубокого чем тот, что вызывает эти функции.

для тех кто хочет сказать что тупо...почему next()сразу не возвращает фолс если следующего результата нету.

это не тупо - логика расчитана втом числе на асинхроность выполнения запроса и запустившего запрос кода(клиента)
и клиент проверив isNextResult понимает что результат следующий есть, но это не значит что сервер готов его отдать. готовность имено и проверяеться фукнцией некст.

почему я назвал секцию критической...ибо интуиция подсказывает, что в вашем случае вы в неё попасть не должны...у вас нету асинхроности...если курсор управления попал на команду while - то уже все рузультаты готовы к отдаче. да и для мускла не слышал что хоть гдето есть вариант другой...что он отдаст рузультат селекта есчё до физического завершения работы хранимки... можете проверить поставив в хранимку делей на 20 секунд после селекта.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Многократный вызов процедуры / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]