Форум: "Базы";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];
ВнизСтранная работа функций в 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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.035 c