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

Вниз

Странное поведение функции в 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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.047 c
1-1100506148
Lera
2004-11-15 11:09
2004.11.28
Длинна слова.


14-1100022933
SniZ
2004-11-09 20:55
2004.11.28
Пример работы с ed2k


3-1099383207
Rule
2004-11-02 11:13
2004.11.28
Такой глуповатеньки вопросик по IBX7.x TIBDataSet


1-1100255352
П7
2004-11-12 13:29
2004.11.28
Помогите портировать с С++ на Delphi


14-1100026374
Valentina
2004-11-09 21:52
2004.11.28
программа "Тест"