Форум: "Базы";
Текущий архив: 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.036 c