Главная страница
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
14-1105239856
Думкин
2005-01-09 06:04
2005.01.30
С Днем Рождения! 9 января


1-1105900470
Fofka
2005-01-16 21:34
2005.01.30
Скрытое приложение


1-1106041608
ghg
2005-01-18 12:46
2005.01.30
передача параметров модальному окну


1-1105899083
Ньюб
2005-01-16 21:11
2005.01.30
Доступ к свойствам компонентов


14-1105628391
Cosinus
2005-01-13 17:59
2005.01.30
Блин, замучался ужО...