![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Хранимая процедура не выполняется из программы [D5, Firebird]
a-tester © (2005-02-09 13:16:00)Здравствуйте. Суть проблемы в следующем:
имеется хранимая процедура, вносящая изменения в базу при определенных условиях (разрешение на выполнение есть):
CREATE PROCEDURE SETCALIBRATEDOT (
T_ID INTEGER,
N_ID INTEGER,
DELTA DOUBLE PRECISION)
RETURNS (
C_IN INTEGER,
C_DL DOUBLE PRECISION)
AS
DECLARE VARIABLE TMP INTEGER;
begin
...
suspend;
end
эта процедура правильно отрабатывает в IBExpert, но не работает при вызове из программы...
вот вызов в программе:
with Proc3 do begin
Prepare;
try
ParamByName('T_ID').AsInteger:=1000;
ParamByName('N_ID').AsInteger:=10;
ParamByName('DELTA').AsFloat:=0.2;
ExecProc;
finally
Close;
end;
так вот, после отработки никаких изменений в базе не наблюдается.
помогите разобраться в проблеме. :)
спасибо.
a-tester (2005-02-10 10:03:00) [1]прошу прощения за задержку ответа...
определял изменения так:
1-запускаю IBExpert, просматриваю значения в таблице
2-запускаю приложение, выполняю процедуру из приложения
3-закрываю приложение
4-переоткрываю базу в IBExpert (Reconnect) и...
изменений не вижу...
добавил CommitRetaining после FibQuery.Close;
вроде записывает...
большое спасибо всем за участие.
Deniz (2005-02-10 07:49:00) [2]>Desdechado © (09.02.05 18:33) [14]
>SQL.Text := 'SELECT...
и
ExecQuery;
несовместимы
Правда? Даже если это FIBPlus? [4]
Нету у pFIBQuery метода Open. Есть такое св-во и оно read-only!
А для выполнения используется pFIBQuery1.ExecQuery
>a-tester (09.02.05 14:49) [12]
Этот код правильный и работает.
Вопрос: как проверяешь наличие изменений в БД?
Транзакцию коммитишь? Какие параметры транзакций, в которой работает процедура и в которой смотришь изменения?
Petr V. Abramov (2005-02-09 22:40:00) [3]> проседура вносит (или не вносит - зависит от вычисляемых в ней
> условий) изменения в базу и возвращает (в любом случае)
> некоторый результат.
Ну так и присвойте результат какому-нить параметру процедуры. И после вызова анализируйте его.
> помнится мне, что в одной из статей на ibase.ru рекомендовали
> suspend вставлять в любую ХП (хотя я могу ошибиться).
Если видел, "report bug" :)
> Да и то, что в IBExpert ХП работает, явно свидетельствует о том,
что нет деления на ноль :)
> Я может задам глупый вопрос, но где Commit для транзакции?
Моя транзакция, где хочу, там и коммит :)
Desdechado (2005-02-09 18:33:00) [4]SQL.Text := 'SELECT...
и
ExecQuery;
несовместимы
Digitman (2005-02-09 15:03:00) [5]
> a-tester (09.02.05 14:49) [12]
да ешкин кот !!
ну нафига ты suspend-то лепишь в процедуре, если вызываешь ее по ExecProc ?!
> SQL.Text:='select
этим ты подразумаваешь возврат процедурой НАБОРА ДАННЫХ (НД), для того ты туда, в процедуру, suspend и влупил !
ну так а какого же тогда ляда ты обращаешься к процедуре не как к возвращающей НД(Open) ?
ну что тут непонятного-то ?
with DM, Q3 do begin
SQL.Text:='select C_IN, C_DL from SETCALIBRATEDOT(?t_id, ?n_id, ?delta)';
Prepare;
try
ParamByName('T_ID').AsInteger:=1140;
ParamByName('N_ID').AsInteger:=4;
ParamByName('DELTA').AsDouble:=0.25;
Open; //здесь, очевидно, неявно стартует транзакция
.. чего-то там делаем с НД ...
finally
Close; //а здесь ранее стартованная неявно транзакция вовсе необязательно подтверждается или откатывается !
end;
end;
a-tester (2005-02-09 14:49:00) [6]я уже по-разному пробовал... например так:
TpFibQuery
with DM, Q3 do begin
SQL.Text:='select C_IN, C_DL from SETCALIBRATEDOT(?t_id, ?n_id, ?delta)';
Prepare;
try
ParamByName('T_ID').AsInteger:=1140;
ParamByName('N_ID').AsInteger:=4;
ParamByName('DELTA').AsDouble:=0.25;
ExecQuery;
finally
Close;
end;
end;
Fareader (2005-02-09 14:48:00) [7]Неважно влупил suspend автор поста или нет. Важно другое - если процедура ИЗМЕНЯЕТ данные, то эти действия нужно подтвердить Commit и еще один наводящий вопрос - какой компонент используется?
Digitman (2005-02-09 14:27:00) [8]
> a-tester
> у меня дикое подозрение, что нужно принудительно описывать
> выходные параметры процедуры
да !
если оне НЕ селективная !
НО !
ты влупил suspend, претендуя тем самым на НД и курсор СЕЛЕКТИВНОЙ процедуры !
так какого ж ... ты обращаешься к поцедуре НЕ как к селективной ?!
Digitman (2005-02-09 14:24:00) [9]
> suspend вставлять в любую ХП (хотя я могу ошибиться).
и оч сильно ошибаешься.
> где Commit для транзакции?
он вполне м.б. неявным... равно как и StartTransaction
a-tester (2005-02-09 14:23:00) [10]:) пардона прошу... я не специально...
а Commit нет, так нет явного StartTransaction
у меня дикое подозрение, что нужно принудительно описывать выходные параметры процедуры...
Fareader (2005-02-09 14:18:00) [11]Господа, то, что написано suspend - это еще не ошибка, помнится мне, что в одной из статей на ibase.ru рекомендовали suspend вставлять в любую ХП (хотя я могу ошибиться). Да и то, что в IBExpert ХП работает, явно свидетельствует о том, что проблема не в suspend. Я может задам глупый вопрос, но где Commit для транзакции?
ExecProc и Close я вижу, а вот где Commit?
Digitman (2005-02-09 14:08:00) [12]
> прошу прощения, забыл сказать, что пользуюсь FibPlus 5.3
мало того, ты "забыл" сказать, что такое Proc3 .. сиди тут и телепатируй, понимаешь ли) ...
Digitman (2005-02-09 14:05:00) [13]
> и возвращает .. некоторый результат
ГДЕ это видно из текста SP ?
я вижу suspend, а suspend это не "результат", а управление курсором открытого НД .. а НД подразумевает СЕЛЕКТИВНЫЙ запрос .. а селективный запрос подразумевает SELECT-clause .. а SELECT-clause на стороне клиента подразумевает отнюдб не ExecProc, а Open ...
a_tester (2005-02-09 14:01:00) [14]прошу прощения, забыл сказать, что пользуюсь FibPlus 5.3
a-tester (2005-02-09 13:59:00) [15]проседура вносит (или не вносит - зависит от вычисляемых в ней условий) изменения в базу и возвращает (в любом случае) некоторый результат.
сейчас попробую с Query.Open.
Digitman (2005-02-09 13:50:00) [16]
> a-tester
а уж если ExecProc, тогда suspend - ни к селу ни к городу ..
suspend на стороне сервера подразумевает Query.Open на стороне клиента
Digitman (2005-02-09 13:46:00) [17]
> никаких изменений в базе не наблюдается
а какие "изменения в базе" ты ожидаешь ?
судя по suspend SP у тебя селективная.. тогда не ExecProc нужен , а Open !
или под ...подразумеваются некие модифицирующие запросы ?
тогда зачем suspend ?