Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
1-1109375074
oleg_SYS
2005-02-26 02:44
2005.03.13
Глобальная обработка ошибок приложения


14-1108479143
GRAND25
2005-02-15 17:52
2005.03.13
Новый футбольный сезон


11-1088968274
Sagrer
2004-07-04 23:11
2005.03.13
Запись инфы из ключа реестра в файл


1-1109315695
Нуждающийся в помощи
2005-02-25 10:14
2005.03.13
Бинарные операции


4-1107179861
TAHAT
2005-01-31 16:57
2005.03.13
Как приостановить выполнение функции, вызванной из DLL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский