Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.13;
Скачать: CL | DM;

Вниз

Хранимая процедура не выполняется из программы   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.043 c
4-1107195222
Ландграф Павел
2005-01-31 21:13
2005.03.13
Ввести в поле чужой программы свой текст


1-1109236934
X9
2005-02-24 12:22
2005.03.13
Трабла со сворачиванием


1-1109274151
Генри
2005-02-24 22:42
2005.03.13
Как разбить файл на части, а потом его собрать?


14-1108784018
Doxygen
2005-02-19 06:33
2005.03.13
Знатокам HTML


14-1109049605
begin...end
2005-02-22 08:20
2005.03.13
С Днём рождения! 22 февраля