Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];

Вниз

Ошибка переполнения в IBQuery.   Найти похожие ветки 

 
Zn   (2003-10-22 16:36) [0]

Помогите!
ХП DEN обращается к ХП DEN_GR.
Смоделировал то же самое с помощью View, где вместо параметров подставлял фактические значения - всё работает. Сделал через ХП -постоянно выскакивает ошибка
Arithmetic overflow or division by zero has occurred.
Arithmetic exception, numeric overflow, or string truncation.
Перепробовал массу вариантов - везде на каком-то этапе эта ошибка. Подскажите, что делать?

CREATE PROCEDURE DEN (
BDT INTEGER,
DT2 DATE)
RETURNS (
SHOT CHAR(8),
T0601 DOUBLE PRECISION,
T0602 DOUBLE PRECISION,
T0603 DOUBLE PRECISION,
T0604 DOUBLE PRECISION,
T0605 DOUBLE PRECISION,
T0606 DOUBLE PRECISION)
AS
BEGIN
IF (:BDT=0) THEN
BEGIN
FOR
SELECT SPR_MASK.SHOT SHOT, DGR1.T060*SPR_MASK.GR1 T0601,
DGR2.T060*SPR_MASK.GR2 T0602,
DGR3.T060*SPR_MASK.GR3 T0603,
DGR4.T060*SPR_MASK.GR4 T0604,
DGR5.T060*SPR_MASK.GR5 T0605,
DGR6.T060*SPR_MASK.GR6 T0606
FROM spr_mask
LEFT OUTER JOIN DEN_GR(:DT2,"1",0) DGR1 ON (SPR_MASK.SHOT = DGR1.SHOT)
LEFT OUTER JOIN DEN_GR(:DT2,"2",0) DGR2 ON (SPR_MASK.SHOT = DGR2.SHOT)
LEFT OUTER JOIN DEN_GR(:DT2,"3",0) DGR3 ON (SPR_MASK.SHOT = DGR3.SHOT)
LEFT OUTER JOIN DEN_GR(:DT2,"4",0) DGR4 ON (SPR_MASK.SHOT = DGR4.SHOT)
LEFT OUTER JOIN DEN_GR(:DT2,"5",0) DGR5 ON (SPR_MASK.SHOT = DGR5.SHOT)
LEFT OUTER JOIN DEN_GR(:DT2,"6",0) DGR6 ON (SPR_MASK.SHOT = DGR6.SHOT)
WHERE
(
(SPR_MASK.BT = 0)
)
ORDER BY SPR_MASK.SHOT
INTO :SHOT,
:T0601,
:T0602,
:T0603,
:T0604,
:T0605,
:T0606
DO
BEGIN
SUSPEND;
END
END
END

CREATE PROCEDURE DEN_GR (
DT2 DATE,
GR11 CHAR(1),
VB SMALLINT)
RETURNS (
SHOT CHAR(8),
T060 NUMERIC(15,2))
AS
BEGIN
FOR
SELECT SPR_MASK.SHOT, FT.T060/100. T060
FROM SPR_MASK
INNER JOIN FT ON (SPR_MASK.SHOT = FT.KOD)
WHERE
(
(SPR_MASK.bt=:VB)
and
(FT.DT = :DT2)
and
(FT.GR = :GR11)
and
(FT.t060 <> 0.00)
)
ORDER BY SPR_MASK.SHOT
INTO :SHOT,:T060
DO
BEGIN
SUSPEND;
END
END


 
Romkin   (2003-10-22 17:40) [1]

1. Скорее всего именно string truncation. spr_mask - какое там поле SHOT?
2. Ну зачем же так мило издеваться над interbase?
left join великолепно раскладывается в цикле:
select a.f3, b.f3 from a left join b on a.f1 = b.f1
вполне получается

for select ... from a into :f1, :f2, af3, ...
do begin
bf3 = NULL;
select f3 from b where b.f1 = :f1
into :bf3;
if (bf3 is not NULL) then suspend;
end;

а join (AKA inner join) - то проще, в цикле

for select f3 from b where b.f1 = :f1
into :bf3
do suspend;

ДУмаю, идея понятна


 
Zn   (2003-10-22 18:05) [2]


> 1. Скорее всего именно string truncation. spr_mask - какое
> там поле SHOT?

Тип поля везде CHAR(8).

Но насчёт второго, то не очень понятно...
А может убрать suspend?


 
Zacho   (2003-10-23 08:03) [3]

1. А процедура DEN_GR выполняется без ошибок ?
2. Возможно переполнение при умножении, проверь.
3. Возможно, дело в join"е с ХП, в IB есть баги с этим. Попробуй переделать без второй ХП.

> А может убрать suspend?

Тогда эта ХП тебе ничего не вернет.


 
Johnmen   (2003-10-23 09:15) [4]

4. Сделай разные имена поля-алиаса-параметра.


 
Zn   (2003-10-23 11:22) [5]


> Zacho © (23.10.03 08:03) [3]


> 1. А процедура DEN_GR выполняется без ошибок ?

Без ошибок.


> 2. Возможно переполнение при умножении

Нет, там множители меньше 1.


> Возможно, дело в join"е с ХП, в IB есть баги с этим

Мне кажется, именно с этим. Делаю то же самое с помощью View, подставляя фактические параметры - всё отлично.

Попробую всё-таки без второй ХП.
Спасибо.


 
Zacho   (2003-10-23 11:32) [6]


> Zn (23.10.03 11:22) [5]

Или воспользуйся советом Romkin © (22.10.03 17:40) [1] и вместо join-ов с ХП сделай выборку из ХП в цикле FOR SELECT. Т.е. примерно так:
FOR SELECT
SHOT,
GR1,GR2,..
FROM spr_mask
WHERE (SPR_MASK.BT = 0)
ORDER BY SPR_MASK.SHOT
INTO :SHOT,:GR1,:GR2,..
DO
BEGIN
SELECT T060*GR1 FROM DEN_GR (:DT2,"1",0) INTO :TO601;
SELECT T060*GR2 FROM DEN_GR (:DT2,"2",0) INTO :TO602;
...
SUSPEND;
END


 
Zn   (2003-10-23 11:54) [7]


> Zacho © (23.10.03 11:32) [6]

Спасибо, это более понятно.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.04 c
8-41759
pasha676
2003-07-08 15:57
2003.11.13
Front с прозрачным фоном на Canvas-e


1-41330
GIL
2003-10-30 17:21
2003.11.13
остановить программу


1-41685
Egorr
2003-10-24 21:57
2003.11.13
Delphi && URL


1-41438
AndDem
2003-10-29 12:29
2003.11.13
OnActive в MDIChild


3-41054
dtm
2003-10-23 12:05
2003.11.13
Откуда вытащить строку





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский