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

Вниз

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

 
YuRock ©   (2004-12-23 12:43) [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;


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


 
YuRock ©   (2004-12-23 13:05) [1]

Тема закрыта!
Решение:

EXCEPTION WHEN NO_DATA_FOUND THEN
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 RES_VALUE;
EXCEPTION WHEN NO_DATA_FOUND THEN
 RETURN "0";
END;


 
Sergey13 ©   (2004-12-23 13:07) [2]

Ну раскажи, что такое DUMMY то?



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

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

Наверх




Память: 0.47 MB
Время: 0.027 c
1-1105700684
Dmitry_04
2005-01-14 14:04
2005.01.30
Как мне перевести свой тип в поток?


4-1102487250
Рамиль
2004-12-08 09:27
2005.01.30
Можно как нибудь запустить службу с нужным приоритетом?


14-1105627506
Cosinus
2005-01-13 17:45
2005.01.30
Хм... Глупый вопрос,но все же. Как удалить установленный Package?


1-1106045945
ShimON
2005-01-18 13:59
2005.01.30
Шифрование паролей


1-1105703664
tolstiak
2005-01-14 14:54
2005.01.30
Что посоветуете?