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

Вниз

Странная работа функций в Oracle   Найти похожие ветки 

 
YuRock ©   (2004-12-23 12:27) [0]

Добрай день.
Натолкнулся на одну проблему. Скажите, это глюк Оракла (или может этой версии - у меня 8.1.7.3.0), либо это нормально (в чем я сомневаюсь).

Итак. Кратко сформулирую проблему "Выход из функции при SELECT INTO".
Написал функцию (подобную этой):

CREATE OR REPLACE FUNCTION SOME_FUNC(IN_VALUE VARCHAR2) RETURN VARCHAR2
IS
 RES_VALUE VARCHAR2(10);
BEGIN
 RES_VALUE := "0";
 SELECT DUMMY INTO RES_VALUE
 FROM DUAL WHERE DUMMY = IN_VALUE;
 --
 RETURN RES_VALUE;
END;

И что я вижу:

SQL> SELECT SOME_FUNC("X") FROM DUAL;

SOME_FUNC("X")
-------------------------------------
X

но если

SQL> SELECT SOME_FUNC("НЕ НАЙТИ") FROM DUAL;

SOME_FUNC("X")
-------------------------------------


Я думал, что будет как в Interbase - если SELECT не возвращает ни одной строки, то SELECT INTO не изменит переменную RES_VALUE, и она будет равна предыдущему значению. Которое я и верну. Но почему-то возвращается NULL.

Ну ладно. Сделал проверку после SELECT"а:

 IF (RES_VALUE IS NULL) THEN
   RES_VALUE := "0";
 END;

Не помогло - ф-ция все-равно упорно возвращает NULL. Тогда я сделал так:

CREATE OR REPLACE FUNCTION SOME_FUNC(IN_VALUE VARCHAR2) RETURN VARCHAR2
IS
 RES_VALUE VARCHAR2(10);
BEGIN
 SELECT DUMMY INTO RES_VALUE
 FROM DUAL WHERE DUMMY = IN_VALUE;
 --
 RETURN "X";
END;

По идее, ф-ция ВСЕГДА должна возвращать "X". Но нет!

SQL> SELECT SOME_FUNC("X") FROM DUAL;

SOME_FUNC("X")
-------------------------------------
X
SQL> SELECT SOME_FUNC("НЕ НАЙТИ") FROM DUAL;

SOME_FUNC("X")
-------------------------------------


Т.е. происходит что-то типа автоматического RETURN NULL, если в SELECT INTO "нет записей".

Не, ну я конечно сделал пока так (некрасиво и дольше работает):

CREATE OR REPLACE FUNCTION SOME_FUNC(IN_VALUE VARCHAR2) RETURN VARCHAR2
IS
 RES_COUNT INTEGER;
 RES_VALUE VARCHAR2(10);
BEGIN
 RES_VALUE := "0";
 --
 SELECT COUNT(*) INTO RES_COUNT
 FROM DUAL WHERE DUMMY = IN_VALUE;
 IF (RES_COUNT <> 0) THEN
   SELECT DUMMY INTO RES_VALUE
   FROM DUAL WHERE DUMMY = IN_VALUE;
 END IF;
 RETURN RES_VALUE;
END;


Но, скажите пожалуйста, это баг Оракла (или этой версии), или фича?


 
Sergey13 ©   (2004-12-23 12:34) [1]

А что такое DUMMY? Вроде уже видел где-то, но что такое не знаю.



Страницы: 1 вся ветка

Текущий архив: 2005.01.30;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.047 c
3-1103972328
Nata
2004-12-25 13:58
2005.01.30
IB6


3-1103114467
Mishenka
2004-12-15 15:41
2005.01.30
Почему не сохраняется минимальное значение?


3-1104314031
yaric
2004-12-29 12:53
2005.01.30
Странная ошибка TPFibDatabase


3-1103802934
ShotGuN
2004-12-23 14:55
2005.01.30
Как добавить несколько строк одновременно?


3-1104155962
Артемиус
2004-12-27 16:59
2005.01.30
Как определить количество и имена таблиц в базе?