![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Странная работа функций в Oracle
YuRock © (2004-12-23 12:43:00)Добрай день.
Натолкнулся на одну проблему. Скажите, это глюк Оракла (или может этой версии - у меня 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 13:07:00) [1]Ну раскажи, что такое DUMMY то?
YuRock (2004-12-23 13:05:00) [2]Тема закрыта!
Решение:
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;