Форум: "Базы";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];
ВнизСтранное поведение функции в Oracle 8i Найти похожие ветки
← →
YuRock © (2004-10-28 13:44) [0]Добрый день. Не хотелось бы думать, что Oracle глючит, по-этому решил задать вопрос сюда - может кто сталкивался.
Проблема: один и тот же запрос (простой !) выдает разные результаты. Причем сразу после коннекта (1-й раз) - неверные, потом - (2-й, 3-й разы...) всегда верные.
Причем неправильная только одна запись и только одно поле!
Покопавшись, определил, что ф-ция, к-рая возвращает знак числа в зависимости от параметров, возвращает NULL! Причем только один раз - для второго поля, хотя для первого поля с теми же параметрами вернула -1!
Запрос:
SELECT SERVICE_AMOUNT * PC_MARK("PC_POS_BALANCE", 3) AS AMOUNT,
SUM_AMOUNT * PC_MARK("PC_POS_BALANCE", 3) AS SUMMA
FROM TRANSACTIONS
Функция:
CREATE FUNCTION PC_MARK(T VARCHAR2,ID_CAUSE INTEGER) RETURN INTEGER IS
RESULT INTEGER;
BEGIN
IF T="PC_BGL" THEN
SELECT DECODE(ID_CAUSE,29,1,31,-1,30,-1,3,1,4,-1,9,-1,0)
INTO RESULT FROM DUAL;
ELSIF T="PC_POS_BALANCE" THEN
SELECT DECODE(ID_CAUSE,29,-1,31,1,30,1,3,-1,4,1,9,1,0)
INTO RESULT FROM DUAL;
END IF;
RETURN RESULT;
END PC_MARK;
Так вот. PC_MARK для одной из записей (в середине), когда умножается на поле SUM_AMOUNT возвращает NULL...
Если у кого были такие проблемы - поделитесь, пожалуйста, опытом избавления от них.
Я вначале грешил на DOA (думал уже, парсит там что-то неправильно), но потом попробовал выполнить этот запрос средствами ADO, BDE - то же самое... Даже "родной" SQL Plus выдал то же...
Спасибо за помощь (или хотябы за сочувствие :) ).
← →
roottim © (2004-10-28 13:53) [1]Если проблемы с NULL то
SELECT NVL(SERVICE_AMOUNT, 0) * PC_MARK("PC_POS_BALANCE", 3) AS AMOUNT,
NVL(SUM_AMOUNT, 0) * PC_MARK("PC_POS_BALANCE", 3) AS SUMMA
FROM TRANSACTIONS
а что такое выдает разные результаты ты их не привел
← →
Johnmen © (2004-10-28 13:54) [2]Я так понимаю, что процедура возвращает NULL.
← →
Reindeer Moss Eater © (2004-10-28 13:56) [3]Поля SERVICE_AMOUNT или SUM_AMOUNT имеют в этой записи NULL.
Либо автор привел здесь неточную копию своего кода.
← →
YuRock © (2004-10-28 14:00) [4]> roottim © (28.10.04 13:53) [1]
1-ое выполнение запроса (одна из записей):
AMOUNT SUMMA
------ -----
-90
2-ое выполнение запроса (та же запись):
AMOUNT SUMMA
------ -----
-90 -261
Поле SUM_AMOUNT оба раза равно 261 - я проверял.
← →
YuRock © (2004-10-28 14:02) [5]> Reindeer Moss Eater © (28.10.04 13:56) [3]
> "Поля SERVICE_AMOUNT или SUM_AMOUNT имеют в этой записи NULL."
> "Либо автор привел здесь неточную копию своего кода."
Ох, если бы Вы были правы - я был бы безгранично благодарен!
Но увы...
← →
Reindeer Moss Eater © (2004-10-28 14:03) [6]Значит приведен неточный код.
Такой PC_MARK вернет NULL только если T не равен "PC_POS_BALANCE" и не равен "PC_BGL"
← →
YuRock © (2004-10-28 14:05) [7]> Reindeer Moss Eater © (28.10.04 14:03) [6]
А он равен "PC_POS_BALANCE"! Понимаете?
Я уже константы забил руками! Да, раньше эти параметры функции генерились, но сейчас я их уже для отладки забил в "PC_POS_BALANCE" и 3!
То же самое! По-этому и в форум написал...
← →
Reindeer Moss Eater © (2004-10-28 14:08) [8]Трассировка с помощью DBMS_OUTPUT.PUT_LINE.
Помогает поверить в "не верь глазам своим"
← →
roottim © (2004-10-28 14:11) [9]так... результат после соединения кокой (на злащастной строчке) по этому запросу?
SELECT SERVICE_AMOUNT * PC_MARK("PC_POS_BALANCE", 3) AS AMOUNT,
SUM_AMOUNT * PC_MARK("PC_POS_BALANCE", 3) AS SUMMA,
SERVICE_AMOUNT, PC_MARK("PC_POS_BALANCE", 3) f1,
SUM_AMOUNT, PC_MARK("PC_POS_BALANCE", 3) f2
FROM TRANSACTIONS
← →
YuRock © (2004-10-28 14:20) [10]> roottim © (28.10.04 14:11) [9]
1-ое выполнение запроса (одна из записей):
AMOUNT SUMMA F1 F2
------ ------ ---------- ----------
-90 -261 -1
2-ое выполнение запроса (та же запись):
AMOUNT SUMMA F1 F2
------ ------ ---------- ----------
-90 -261 -1 -1
Я просто в шоке! Выходит, NULL возвращается только при последнем (в этой записи) вызове PC_MARK!!!
Спасибо Вам! Это уже лучше :)
← →
Reindeer Moss Eater © (2004-10-28 14:26) [11]Интересно, откуда PC_MARK "знает", что её вызывают "последний" раз?
В значениях фактических параметров дело.
И больше ни в чем.
← →
YuRock © (2004-10-28 14:26) [12]> roottim © (28.10.04 14:11) [9]
Я немного не такой как Вы просили запрос сделал (и показал в [10]):
SELECT SERVICE_AMOUNT * PC_MARK("PC_POS_BALANCE", 3) AS AMOUNT,
SUM_AMOUNT * PC_MARK("PC_POS_BALANCE", 3) AS SUMMA,
PC_MARK("PC_POS_BALANCE", 3) f1,
PC_MARK("PC_POS_BALANCE", 3) f2
FROM TRANSACTIONS
В Вашем случае было бы примерно то же. Еще раз спасибо за идею.
← →
den_777 (2004-10-28 14:35) [13]А может при первом вызове в DUAL нет ни одной строки(записи), тогда PC_MARK.Result тоже будет NULL
← →
Reindeer Moss Eater © (2004-10-28 14:37) [14]в DUAL нет ни одной строки(записи)
Смеяться после слова лопата?
← →
Sergey13 © (2004-10-28 14:40) [15]2YuRock ©
Мне тоже кажется что причина описана в [6]. Попробуй от этого избавиться и посмотри.
← →
roottim © (2004-10-28 14:59) [16]результат вот того плиз
Select * From v$version
надо посмотреть нет ли известного бага
и попробуй использовать number (типа пляски с бубном :))CREATE FUNCTION PC_MARK(T VARCHAR2,ID_CAUSE NUMBER) RETURN NUMBER IS
RESULT NUMBER;
>Мне тоже кажется что причина описана в [6]
но неможет же так бытьSELECT SERVICE_AMOUNT * PC_MARK("PC_POS_BALANCE", 3) AS AMOUNT,
SUM_AMOUNT * PC_MARK("PC_POS_BALANCE", 3) AS SUMMA,
PC_MARK("PC_POS_BALANCE", 3) f1,
PC_MARK("PC_POS_BALANCE", 3) f2
FROM TRANSACTIONS
← →
Sergey13 © (2004-10-28 15:02) [17]2[16] roottim © (28.10.04 14:59)
>но неможет же так быть
Но и попробовать не трудно. 8-)
(типа пляски с бубном :))
← →
Reindeer Moss Eater © (2004-10-28 15:04) [18]но неможет же так быть
Значит Ларри Эллисон заблудился в двух ветвлениях одного ИФ"а?
← →
YuRock © (2004-10-28 15:55) [19]> roottim © (28.10.04 14:59) [16]
BANNER
----------------------------------------------------------------
Oracle8i Enterprise Edition Release 8.1.7.3.0 - Production
PL/SQL Release 8.1.7.3.0 - Production
CORE 8.1.7.2.1 Production
TNS for 32-bit Windows: Version 8.1.7.3.0 - Production
NLSRTL Version 3.4.1.0.0 - Production
← →
YuRock © (2004-10-28 15:58) [20]> roottim © [16]
> Бубен
не помог...
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.037 c