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

Вниз

Ошибка переполнения в 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.023 c
1-41222
SkyRanger
2003-10-31 16:21
2003.11.13
Небольшой вопрос про наследование


14-41959
Skier
2003-10-20 10:59
2003.11.13
Формула-1 в России ?


1-41515
Артем
2003-10-25 22:22
2003.11.13
ShellExecute


4-42257
Julliete
2003-08-14 11:20
2003.11.13
Запуск приложений.


1-41500
Furkan
2003-10-28 11:56
2003.11.13
работа с ListView (TListItems)