Главная страница
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.051 c
6-1100608428
slaga
2004-11-16 15:33
2005.01.30
Полный путь в другой домен ?


1-1105623063
vvv_spb
2005-01-13 16:31
2005.01.30
Tab в DBEdit


14-1105191129
Luba
2005-01-08 16:32
2005.01.30
конверсия форматов


1-1106114041
fisherman
2005-01-19 08:54
2005.01.30
Сумма в отчете


4-1102517372
serg_newone
2004-12-08 17:49
2005.01.30
Засыпание серверного приложения (виноват файл-подкачки?).