Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
14-1100366571
MeF88
2004-11-13 20:22
2004.11.28
VCL или Win API


6-1095420003
SergeySEM
2004-09-17 15:20
2004.11.28
как пропилинговать сервак


1-1100411021
pumberman
2004-11-14 08:43
2004.11.28
Помогите с xor разобраться


14-1100092045
novice_man
2004-11-10 16:07
2004.11.28
Утечка памяти, что это и где искать!!


3-1098175505
Grizzly
2004-10-19 12:45
2004.11.28
Выгрузка БД в текстовый файл





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