Форум: "Базы";
Текущий архив: 2005.03.13;
Скачать: [xml.tar.bz2];
ВнизХранимая процедура не выполняется из программы Найти похожие ветки
← →
a-tester (2005-02-09 13:16) [0]Здравствуйте. Суть проблемы в следующем:
имеется хранимая процедура, вносящая изменения в базу при определенных условиях (разрешение на выполнение есть):
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;
так вот, после отработки никаких изменений в базе не наблюдается.
помогите разобраться в проблеме. :)
спасибо.
← →
Digitman © (2005-02-09 13:46) [1]
> никаких изменений в базе не наблюдается
а какие "изменения в базе" ты ожидаешь ?
судя по suspend SP у тебя селективная.. тогда не ExecProc нужен , а Open !
или под ... подразумеваются некие модифицирующие запросы ?
тогда зачем suspend ?
← →
Digitman © (2005-02-09 13:50) [2]
> a-tester
а уж если ExecProc, тогда suspend - ни к селу ни к городу ..
suspend на стороне сервера подразумевает Query.Open на стороне клиента
← →
a-tester (2005-02-09 13:59) [3]проседура вносит (или не вносит - зависит от вычисляемых в ней условий) изменения в базу и возвращает (в любом случае) некоторый результат.
сейчас попробую с Query.Open.
← →
a_tester (2005-02-09 14:01) [4]прошу прощения, забыл сказать, что пользуюсь FibPlus 5.3
← →
Digitman © (2005-02-09 14:05) [5]
> и возвращает .. некоторый результат
ГДЕ это видно из текста SP ?
я вижу suspend, а suspend это не "результат", а управление курсором открытого НД .. а НД подразумевает СЕЛЕКТИВНЫЙ запрос .. а селективный запрос подразумевает SELECT-clause .. а SELECT-clause на стороне клиента подразумевает отнюдб не ExecProc, а Open ...
← →
Digitman © (2005-02-09 14:08) [6]
> прошу прощения, забыл сказать, что пользуюсь FibPlus 5.3
мало того, ты "забыл" сказать, что такое Proc3 .. сиди тут и телепатируй, понимаешь ли) ...
← →
Fareader (2005-02-09 14:18) [7]Господа, то, что написано suspend - это еще не ошибка, помнится мне, что в одной из статей на ibase.ru рекомендовали suspend вставлять в любую ХП (хотя я могу ошибиться). Да и то, что в IBExpert ХП работает, явно свидетельствует о том, что проблема не в suspend. Я может задам глупый вопрос, но где Commit для транзакции?
ExecProc и Close я вижу, а вот где Commit?
← →
a-tester (2005-02-09 14:23) [8]:) пардона прошу... я не специально...
а Commit нет, так нет явного StartTransaction
у меня дикое подозрение, что нужно принудительно описывать выходные параметры процедуры...
← →
Digitman © (2005-02-09 14:24) [9]
> suspend вставлять в любую ХП (хотя я могу ошибиться).
и оч сильно ошибаешься.
> где Commit для транзакции?
он вполне м.б. неявным... равно как и StartTransaction
← →
Digitman © (2005-02-09 14:27) [10]
> a-tester
> у меня дикое подозрение, что нужно принудительно описывать
> выходные параметры процедуры
да !
если оне НЕ селективная !
НО !
ты влупил suspend, претендуя тем самым на НД и курсор СЕЛЕКТИВНОЙ процедуры !
так какого ж ... ты обращаешься к поцедуре НЕ как к селективной ?!
← →
Fareader (2005-02-09 14:48) [11]Неважно влупил suspend автор поста или нет. Важно другое - если процедура ИЗМЕНЯЕТ данные, то эти действия нужно подтвердить Commit и еще один наводящий вопрос - какой компонент используется?
← →
a-tester (2005-02-09 14:49) [12]я уже по-разному пробовал... например так:
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;
← →
Digitman © (2005-02-09 15:03) [13]
> 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;
← →
Desdechado © (2005-02-09 18:33) [14]SQL.Text := "SELECT...
и
ExecQuery;
несовместимы
← →
Petr V. Abramov © (2005-02-09 22:40) [15]> проседура вносит (или не вносит - зависит от вычисляемых в ней
> условий) изменения в базу и возвращает (в любом случае)
> некоторый результат.
Ну так и присвойте результат какому-нить параметру процедуры. И после вызова анализируйте его.
> помнится мне, что в одной из статей на ibase.ru рекомендовали
> suspend вставлять в любую ХП (хотя я могу ошибиться).
Если видел, "report bug" :)
> Да и то, что в IBExpert ХП работает, явно свидетельствует о том,
что нет деления на ноль :)
> Я может задам глупый вопрос, но где Commit для транзакции?
Моя транзакция, где хочу, там и коммит :)
← →
Deniz (2005-02-10 07:49) [16]>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]
Этот код правильный и работает.
Вопрос: как проверяешь наличие изменений в БД?
Транзакцию коммитишь? Какие параметры транзакций, в которой работает процедура и в которой смотришь изменения?
← →
a-tester (2005-02-10 10:03) [17]прошу прощения за задержку ответа...
определял изменения так:
1-запускаю IBExpert, просматриваю значения в таблице
2-запускаю приложение, выполняю процедуру из приложения
3-закрываю приложение
4-переоткрываю базу в IBExpert (Reconnect) и...
изменений не вижу...
добавил CommitRetaining после FibQuery.Close;
вроде записывает...
большое спасибо всем за участие.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2005.03.13;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.033 c