Главная страница
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.042 c
1-1106136747
igor_buz
2005-01-19 15:12
2005.01.30
Как определить какая процедура вызвала открытие формы?


4-1102700725
zioza
2004-12-10 20:45
2005.01.30
Сменить раскладку клавиатуры, другому активному окну


6-1100011528
MegaVolt
2004-11-09 17:45
2005.01.30
Как сделать для каждого пользователя подкл. к серверу свой слиент


1-1105698951
Unknown
2005-01-14 13:35
2005.01.30
Application.CreateForm


14-1105217329
syte_ser78
2005-01-08 23:48
2005.01.30
Nova News