Форум: "Базы";
Текущий архив: 2002.07.25;
Скачать: [xml.tar.bz2];
ВнизОшибки при сцеплении строк в процедурах под IB Найти похожие ветки
← →
Boroda Oleg (2002-07-05 10:50) [0]Господа!
Подскажите, если кто знает, в каких случаях возникает subj:
Arithmetic overflow or division by zero has occurred.
arithmetic exteption, numeric overflow, or string truncation.
Точнее сказать, на что стоит обращать внимание при сцеплении строк которые обрабатываются функциями. О том, что размер результирующей строки должен быть, как минимум сумме сцепляемых строк я знаю, но что еще может быть? Может быть какие нибудь ограничения размера строки, или число сцепляемых строк? Почему такая ошибка может возникать при вызове функций ltrim или rtrim, даже если в строке она одна, и размер строки заведомо меньше ограниченного в функции?
← →
Johnmen (2002-07-05 10:59) [1]Длина результирующей строки не должна превышать размерность поля, в которое ее хотят запихнуть...:)
← →
kaif (2002-07-05 11:29) [2]Иногда если неявно подразумевается определенная длина поля, то конкатенация может привести к ошибке, особенно в запросах с UNION. Иногда имеет смысл после конкатенации делать принудительное приведение типа с помощью CAST.
← →
Boroda Oleg (2002-07-05 12:19) [3]Вроде как все явно подрузамевается, да и насчет результирующей длинны проверяю. Вот ниже привел процедурку. Размеры переменных строго равны тем, какие они в базе. Где я здесь мог ошибиться? Процедура глючит где-то на 50% запросов.
И еще, кстати, как можно с помощью cast регулировать число знаков после запятой? У меня переменная 0.5 передается в строку как "0.500000000000", а надо бы "0.5" ?
CREATE PROCEDURE GETGOOD (
ID INTEGER
) RETURNS (
NAME VARCHAR(300)
) AS
DECLARE VARIABLE FRM VARCHAR(10);
DECLARE VARIABLE AK INTEGER;
DECLARE VARIABLE AMM NUMERIC(15,3);
DECLARE VARIABLE VK INTEGER;
DECLARE VARIABLE VOL NUMERIC(15,3);
DECLARE VARIABLE SVOL VARCHAR(10);
DECLARE VARIABLE SK INTEGER;
DECLARE VARIABLE SUP NUMERIC(15,3);
DECLARE VARIABLE SSUP VARCHAR(10);
DECLARE VARIABLE SERIAL VARCHAR(10);
DECLARE VARIABLE NM VARCHAR(80) CHARACTER SET WIN1251;
DECLARE VARIABLE NAM VARCHAR(300) CHARACTER SET WIN1251;
DECLARE VARIABLE T_VL VARCHAR(10);
begin
FOR
SELECT NAME SERIAL, FR.SFORM FORM, SG.AMMOUNTKEY, SG.AMMOUNT, SG.VOLIMEKEY, SG.VOLIME,
VL.SVOLIME MVOLIME, SG.SUPPORTKEY, SG.SUPPORT, SP.SSUPPORT,
(SELECT NAME FROM GOODTREE WHERE GT.ID_PARENT = ID_GOODTREE) NAME
FROM GOODTREE GT, SERIALGOOD SG, FORM FR, VOLIME VL, SUPPORT SP
WHERE (GT.ID_GOODTREE = :ID)
AND (GT.ID_SOURCE = SG.ID_SERIAL)
AND (SG.FORM = FR.ID_FORM)
AND (SG.MEASUREVOLIME = VL.ID_VOLIME)
AND (SG.MEASURESUPPORT = SP.ID_SUPPORT)
INTO Serial, Frm, AK, Amm, VK, Vol, SVol, SK, Sup, SSup, Nm
DO BEGIN
/* Nm = rtrim(Nm);
Nm = ltrim(Nm);
Frm = ltrim(rtrim(Frm)); */
NAM = Nm || " " || Frm;
if (VK = 0) then begin
/* NAME = numbtostr(Vol);*/
t_vl = cast (Vol as varchar(30));
NAM = NAM || t_vl || SVol;
end
NAME = NAM;
SUSPEND;
END
end
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.07.25;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.006 c