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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как получить, то что возвращает выполяемая ХП? 
V
    Опции темы
ksili
Дата 14.5.2007, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



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

begin
  select min(ID_CALL) from t_buffer into :var_id_call;
  select NOMER,TIME_IN from t_buffer where ID_CALL=:var_id_call into :p_phone,:p_time;

  delete from t_buffer where ID_CALL=:var_id_call;
  suspend;
end   


Пишу на Builder 6. Вызываю процедуру так:
Код

 BufferQuery->Transaction->StartTransaction();
 BufferQuery->SQL->Text = "execute procedure CUT_CALL";
 BufferQuery->ExecQuery();
 BufferQuery->Transaction->Commit();


Так вот процедура удаляет запись, но ничего не возвращает (:p_phone и :p_time - выходные параметры процедуры). После её вызова у  меня стоит
Код

 if(BufferQuery->RecordCount)
    {
................
    }

И BufferQuery->RecordCount равно нулю. Значит выходные параметры выполняемой процедуры это не набор данных? Их надо читать не как поля, а как параметры? Как это сделать?


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Akella
Дата 14.5.2007, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



Цитата(ksili @  14.5.2007,  10:56 Найти цитируемый пост)
select min(ID_CALL) from t_buffer into :var_id_call

var_id_call должен быть объявлен, как выходной параметр.
тогда 
Код

Select var_id_call from твоя_процедура(входной параметр)


Добавлено @ 11:34
Цитата(ksili @  14.5.2007,  10:56 Найти цитируемый пост)
BufferQuery

что это?

Добавлено @ 11:35
или
Код

select p_phone, p_time from твоя_процедура


Это сообщение отредактировал(а) Akella - 14.5.2007, 11:40
PM MAIL   Вверх
ksili
Дата 14.5.2007, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



Так var_id_call это внутренняя переменная процедуры. Её возвращать не надо. 
Ну я для интереса попробовал - ничего не изменилось. Интересно хранимки можно как-то пошагово выполнять, что-то типа отладочного режима?


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Akella
Дата 14.5.2007, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



Цитата(ksili @  14.5.2007,  11:39 Найти цитируемый пост)
Так var_id_call это внутренняя переменная процедуры. Её возвращать не надо. 

от блин, та я просто к примеру

Добавлено через 21 секунду
Цитата(ksili @  14.5.2007,  11:39 Найти цитируемый пост)
нтересно хранимки можно как-то пошагово выполнять, что-то типа отладочного режима? 

нельзя

Добавлено через 1 минуту и 17 секунд
можно что-то типа такого: создаешь таблицу, куда будут попадать сообщения
а в процедуре на нужных тебе шагах пишешь значения в эту таблицу, вот и всё
PM MAIL   Вверх
ksili
Дата 14.5.2007, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



Получилось через select, только при этом возвращается всегда одна запись (пустая или непустая), поэтому код стал такой:
Код

 BufferQuery->Transaction->StartTransaction();
 BufferQuery->SQL->Text = "select P_PHONE,P_TIME from CUT_CALL";  
 BufferQuery->ExecQuery();
 BufferQuery->Transaction->Commit();

 nomer = BufferQuery->FieldByName("P_PHONE")->AsString;
 if(!nomer.IsEmpty())
    {
......
    }



А BufferQuery это TpFIBQuery. Кверя короче из FIBPlus

Это сообщение отредактировал(а) ksili - 14.5.2007, 12:01


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Akella
Дата 14.5.2007, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



Цитата(ksili @  14.5.2007,  11:59 Найти цитируемый пост)
возвращается всегда одна запись

почитай про For Select
Код

For Select ... into ...
do begin
 suspend;
end


PM MAIL   Вверх
ksili
Дата 14.5.2007, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



Да я читал когда-то. Вроде там между begin и end выполняются действия для каждой записи попавшей в select. Только зачем мне это? Результатом моей ХП должны быть два поля из самой старой записи (то есть с наименьшим ID), если в таблице что-то есть, либо вообще ничего, если таблица пустая. А что там с остальными записями мне всё равно. Так что for select, по-моему, здесь неуместен.


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Akella
Дата 14.5.2007, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



да, неуместен. Тебе же нужно одну запись получать из хранимки
PM MAIL   Вверх
Deniz
Дата 18.5.2007, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



>Akella & ksili
Пошагово отлаживать ХП МОЖНО
для этого можно воспользоваться IBExpert

>ksili
Код

 BufferQuery->SQL->Text = "select P_PHONE,P_TIME from CUT_CALL";  
 BufferQuery->ExecQuery();
 BufferQuery->Transaction->Commit();

Не совсем понял. Если транзакция закрывается (Commit), то и набор данных закрывается, (если это не UpdateTransaction FIBPlus)
а след-но
Код

nomer = BufferQuery->FieldByName("P_PHONE")->AsString;

должна быть ошибка

Код

if(!nomer.IsEmpty()) { ...... }
 ??? не понятно о чем.
уж лучше проверить 
Код

BufferQuery->FieldByName("P_PHONE")->IsEmpty 

 BufferQuery->ExecQuery(); заменить на  BufferQuery->Open(); и без Commit



--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Akella
Дата 18.5.2007, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



Цитата(Deniz @  18.5.2007,  08:10 Найти цитируемый пост)
>Akella & ksili
Пошагово отлаживать ХП МОЖНО
для этого можно воспользоваться IBExpert

подробнее
PM MAIL   Вверх
ksili
Дата 18.5.2007, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



BufferQuery->Transaction это не UpdateTransaction:
Код

BufferTransaction = new TpFIBTransaction(NULL);

И тем не менее всё работает, никакой ошибки нет.

Зачем
Цитата(Deniz @  18.5.2007,  13:10 Найти цитируемый пост)
BufferQuery->ExecQuery(); заменить на  BufferQuery->Open(); и без Commit

если всё работает?

Про отладку ХП тоже интересно


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Deniz
Дата 18.5.2007, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



Подробнее.
Ну не совсем отладка, но пошаговое выполнение процедуры это реальность.
Вы пользуетесь IBExpert'ом?

Добавлено через 7 минут и 20 секунд
Цитата

И тем не менее всё работает, никакой ошибки нет.

Если бы все работало, и никаких ошибок не было, то и вопросов бы не было ;-)
Не понимаю, или не хватает кода, как у тебя после Commit набор данных остается открытый, неужто кешированный апдейт настроен?


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
ksili
Дата 18.5.2007, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



Я ничего вроде не настраивал, всё по-умолчанию. Я всегда так работаю с кверями: 
Выполняю её, подтверждаю, а затем вытягиваю, то что нужно в переменные.
Код

 BufferQuery->Transaction->StartTransaction();
 BufferQuery->SQL->Text = "select P_PHONE,P_TIME from CUT_CALL";  
 BufferQuery->ExecQuery();
 BufferQuery->Transaction->Commit();

 nomer = BufferQuery->FieldByName("P_PHONE")->AsString;

 Вот как раз если её не подтвердить, то BufferQuery->FieldByName("P_PHONE")->AsString ничего не даст. Я поначалу не подтверждал (недавно вообще БД занимаюсь) но методом тыка догадался, что нужно подтвердить.

Правда если следом идет несколько запросов, и в промежутках не надо из них вытаскивать какие-то данные (например они все обновляющие), то можно Commit поставить только после последнего запроса.
Цитата

Если бы все работало, и никаких ошибок не было, то и вопросов бы не было ;-)

Так сейчас вопросов и нет, они были раньше, а сейчас уже вопрос помечен как решённый smile

Это сообщение отредактировал(а) ksili - 18.5.2007, 12:10


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Deniz
Дата 18.5.2007, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



Принцип работы сл-щий:
1. открыть транзакцию
2. прочитать данные
3. подтвердить/отменить транзакцию (здесь она закрывается и все связанные с ней DataSet'ы)
а вот здесь при попытке узнать значение поля должна быть ошибка.
Вероятно у тебя транзакция открывается автоматически или еще чего делается.
В общем не буду больше приставать.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
ksili
Дата 18.5.2007, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



Так это что ли получается транзакция дважды выполняется? Один раз мной, второй раз автоматически? Нехорошо...


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

Обязательно указание:

1. Версию InterBase (Firebird, Yaffil)

2. Способа доступа (ADO, BDE, IBX и т.д.)

  • КАК ПРАВИЛЬНО ОФОРМИТЬ КОД - ЗДЕСЬ
  • КАК ПРАВИЛЬНО УКАЗАТЬ ТЕКСТ ОШИБКИ - ЗДЕСЬ
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Firebird, Interbase | Следующая тема »


 




[ Время генерации скрипта: 0.0614 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.