Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Странное поведение функции в Oracle 8i


YuRock ©   (2004-10-28 13:44:00) 

Добрый день. Не хотелось бы думать, что 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 выдал то же...

Спасибо за помощь (или хотябы за сочувствие :) ).


YuRock   (2004-10-28 15:58:00) [1]

> roottim © [16]
> Бубен

не помог...


YuRock   (2004-10-28 15:55:00) [2]

> 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


Reindeer Moss Eater   (2004-10-28 15:04:00) [3]

но неможет же так быть

Значит Ларри Эллисон заблудился в двух ветвлениях одного ИФ'а?


Sergey13   (2004-10-28 15:02:00) [4]

2[16] roottim ©   (28.10.04 14:59)
>но неможет же так быть
Но и попробовать не трудно. 8-)
(типа пляски с бубном :))


roottim   (2004-10-28 14:59:00) [5]

результат вот того плиз
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 14:40:00) [6]

2YuRock ©
Мне тоже кажется что причина описана в [6]. Попробуй от этого избавиться и посмотри.


Reindeer Moss Eater   (2004-10-28 14:37:00) [7]

в DUAL нет ни одной строки(записи)

Смеяться после слова лопата?


den_777   (2004-10-28 14:35:00) [8]

А может при первом вызове в DUAL нет ни одной строки(записи), тогда PC_MARK.Result тоже будет NULL


Reindeer Moss Eater   (2004-10-28 14:26:00) [9]

Интересно, откуда PC_MARK "знает", что её вызывают "последний" раз?

В значениях фактических параметров дело.
И больше ни в чем.


YuRock   (2004-10-28 14:26:00) [10]

> 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


В Вашем случае было бы примерно то же. Еще раз спасибо за идею.


YuRock   (2004-10-28 14:20:00) [11]

> 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!!!

Спасибо Вам! Это уже лучше :)


roottim   (2004-10-28 14:11:00) [12]

так... результат после соединения кокой (на злащастной строчке) по этому запросу?

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


Reindeer Moss Eater   (2004-10-28 14:08:00) [13]

Трассировка с помощью DBMS_OUTPUT.PUT_LINE.
Помогает поверить в "не верь глазам своим"


YuRock   (2004-10-28 14:05:00) [14]

> Reindeer Moss Eater ©   (28.10.04 14:03) [6]

А он равен 'PC_POS_BALANCE'! Понимаете?

Я уже константы забил руками! Да, раньше эти параметры функции генерились, но сейчас я их уже для отладки забил в 'PC_POS_BALANCE' и 3!

То же самое! По-этому и в форум написал...


Reindeer Moss Eater   (2004-10-28 14:03:00) [15]

Значит приведен неточный код.

Такой PC_MARK вернет NULL только если T не равен 'PC_POS_BALANCE' и не равен 'PC_BGL'


YuRock   (2004-10-28 14:02:00) [16]

> Reindeer Moss Eater ©   (28.10.04 13:56) [3]
> "Поля SERVICE_AMOUNT или SUM_AMOUNT имеют в этой записи NULL."
> "Либо автор привел здесь неточную копию своего кода."

Ох, если бы Вы были правы - я был бы безгранично благодарен!
Но увы...


YuRock   (2004-10-28 14:00:00) [17]

> roottim ©   (28.10.04 13:53) [1]

1-ое выполнение запроса (одна из записей):


AMOUNT SUMMA
------ -----
-90    


2-ое выполнение запроса (та же запись):


AMOUNT SUMMA
------ -----
-90    -261


Поле SUM_AMOUNTоба раза равно 261 - я проверял.


Reindeer Moss Eater   (2004-10-28 13:56:00) [18]

Поля SERVICE_AMOUNT или SUM_AMOUNT имеют в этой записи NULL.
Либо автор привел здесь неточную копию своего кода.


Johnmen   (2004-10-28 13:54:00) [19]

Я так понимаю, что процедура возвращает NULL.


roottim   (2004-10-28 13:53:00) [20]

Если проблемы с 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

а что такое выдает разные результатыты их не привел


Наверх

Титульная страница Поиск, карта сайта Написать письмо