powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Нужен ли здесь неявный курсор
19 сообщений из 19, страница 1 из 1
Нужен ли здесь неявный курсор
    #39733522
ultrasonic7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте! Есть функция, которая возвращает дату со временем, либо без времени, а когда параметром передается строка, она должна возвращать NULL.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 FUNCTION VAL_DATE (iValue in varchar2) RETURN DATE AS
   cDateTimeMask constant varchar2 (21):='dd.mm.yyyy hh24:mi:ss';
   cDateMask constant varchar2 (21):='dd.mm.yyyy';
 BEGIN
   RETURN TO_DATE(iValue, cDateTimeMask);
 EXCEPTION WHEN VALUE_ERROR THEN
   BEGIN
     RETURN TO_DATE(iValue, cDateMask);
   EXCEPTION WHEN OTHERS THEN
     RETURN NULL;
   END;  
 END;


И так
Код: plsql
1.
SELECT SOME_SCHEMA.SOME_PACKAGE.VAL_DATE('15.10.2018 09:05:12') FROM DUAL


и так
Код: plsql
1.
SELECT SOME_SCHEMA.SOME_PACKAGE.VAL_DATE('15.10.2018') FROM DUAL


дата возвращается. Нужно, чтобы при таком вызове
Код: plsql
1.
SELECT SOME_SCHEMA.SOME_PACKAGE.VAL_DATE('10') FROM DUAL


возвращался NULL.
Сейчас возникает ошибка
ORA-01840: длина входного значения недостаточна для формата даты
ORA-06512: на "SOME_SCHEMA.SOME_PACKAGE", line 29


Вопрос - как от неё избавиться? Может, здесь нужен неявный курсор?
...
Рейтинг: 0 / 0
Нужен ли здесь неявный курсор
    #39733529
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ultrasonic7 Может, здесь нужен неявный курсор?
зачем неявный ? делай явный, может БД с какой-нибудь попытки согласится вернуть NULL
...
Рейтинг: 0 / 0
Нужен ли здесь неявный курсор
    #39733538
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ultrasonic7,

Писать логику на EXCEPTION - как бы мовитон

Проверьте длинну iValue и иcходя из этого выберите маску или верните null. Тогда обойдетесь одним EXCEPTION при котором тоже вернете null
...
Рейтинг: 0 / 0
Нужен ли здесь неявный курсор
    #39733543
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with t(s) as (select '15.10.2018 09:05:12' from dual
union all select '15.10.2018' from dual
union all select '10' from dual)
select s, to_date(s default null on conversion error, 'dd.mm.yyyy hh24:mi:ss') d from t;

S                   D                  
------------------- -------------------
15.10.2018 09:05:12 2018-10-15 09:05:12
15.10.2018          2018-10-15 00:00:00
10                  <null> 
...
Рейтинг: 0 / 0
Нужен ли здесь неявный курсор
    #39733553
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with t(s) as (select '15.10.2018 09:05:12' from dual
union all select '15.10.2018' from dual
union all select '10' from dual)
select s, to_date(s default null on conversion error, 'dd.mm.yyyy hh24:mi:ss') d from t;

S                   D                  
------------------- -------------------
15.10.2018 09:05:12 2018-10-15 09:05:12
15.10.2018          2018-10-15 00:00:00
10                  <null> 

не у всех версия БД подходит
...
Рейтинг: 0 / 0
Нужен ли здесь неявный курсор
    #39733556
ultrasonic7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
...
Рейтинг: 0 / 0
Нужен ли здесь неявный курсор
    #39733557
ultrasonic7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не подошёл вариант, к сожалению.
...
Рейтинг: 0 / 0
Нужен ли здесь неявный курсор
    #39733561
ultrasonic7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Меня интересует, почему этот код
Код: plsql
1.
2.
EXCEPTION WHEN OTHERS THEN
     RETURN NULL;


не выполняется, когда в функцию передается строка даже из двух символов ('10')
...
Рейтинг: 0 / 0
Нужен ли здесь неявный курсор
    #39733566
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymxне у всех версия БД подходитГде разработчик путается в двух эксепшенах, да еще и один из которых не нужен, апгрейд это последнее, чего стоит бояться.
...
Рейтинг: 0 / 0
Нужен ли здесь неявный курсор
    #39733571
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ultrasonic7Меня интересует, почему этот код
Код: plsql
1.
2.
EXCEPTION WHEN OTHERS THEN
     RETURN NULL;



не выполняется, когда в функцию передается строка даже из двух символов ('10')значит, ты в него не попадаешь
...
Рейтинг: 0 / 0
Нужен ли здесь неявный курсор
    #39733578
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ultrasonic7Меня интересует, почему этот код
Код: plsql
1.
2.
EXCEPTION WHEN OTHERS THEN
     RETURN NULL;


не выполняется, когда в функцию передается строка даже из двух символов ('10')

потому что
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 EXCEPTION WHEN VALUE_ERROR THEN

   --сюда Вы не попадаете, когда в функцию передается строка даже из двух символов 

   BEGIN
     RETURN TO_DATE(iValue, cDateMask);
   EXCEPTION WHEN OTHERS THEN
     RETURN NULL;
   END;  
 END;



.....
stax
...
Рейтинг: 0 / 0
Нужен ли здесь неявный курсор
    #39733582
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXLПроверьте длину iValue и иcходя из этого выберите маску
не уверен, что это подойдет
Код: sql
1.
SELECT VAL_DATE('1.1.1 1:1') FROM DUAL

VAL_DATE('1.1.11:1')01.01.0001 1:01:00
...
Рейтинг: 0 / 0
Нужен ли здесь неявный курсор
    #39733595
ultrasonic7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может, на ошибки следует смотреть шире? Сделать так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 FUNCTION VAL_DATE (iValue in varchar2) RETURN DATE AS
   cDateTimeMask constant varchar2 (21):='dd.mm.yyyy hh24:mi:ss';
   cDateMask constant varchar2 (21):='dd.mm.yyyy';
 BEGIN
   RETURN TO_DATE(iValue, cDateTimeMask);
 EXCEPTION WHEN OTHERS  THEN
   BEGIN
     RETURN TO_DATE(iValue, cDateMask);
   EXCEPTION WHEN OTHERS THEN
     RETURN NULL;
   END;  
 END;
...
Рейтинг: 0 / 0
Нужен ли здесь неявный курсор
    #39733596
rpovarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IMHO достаточно одной длинной маски, правда на 11g не тестировал, нет её у меня
Код: plsql
1.
2.
3.
4.
5.
6.
7.
 FUNCTION VAL_DATE (iValue in varchar2) RETURN DATE AS
   cDateTimeMask constant varchar2 (21):='dd.mm.yyyy hh24:mi:ss';
 BEGIN
   RETURN TO_DATE(iValue, cDateTimeMask);
 EXCEPTION WHEN OTHERS THEN
     RETURN NULL;
 END;
...
Рейтинг: 0 / 0
Нужен ли здесь неявный курсор
    #39733603
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rpovarovIMHO достаточно одной длинной маски, правда на 11g не тестировал, нет её у меня
Код: plsql
1.
2.
3.
4.
5.
6.
7.
 FUNCTION VAL_DATE (iValue in varchar2) RETURN DATE AS
   cDateTimeMask constant varchar2 (21):='dd.mm.yyyy hh24:mi:ss';
 BEGIN
   RETURN TO_DATE(iValue, cDateTimeMask);
 EXCEPTION WHEN OTHERS THEN
     RETURN NULL;
 END;

а две маски зачем
так тоже работает
Код: plsql
1.
SELECT TO_DATE('1.1.1', 'dd.mm.rrrr hh24:mi:ss') FROM DUAL
...
Рейтинг: 0 / 0
Нужен ли здесь неявный курсор
    #39733742
rpovarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreymxа две маски зачем
так тоже работает
Код: plsql
1.
SELECT TO_DATE('1.1.1', 'dd.mm.rrrr hh24:mi:ss') FROM DUAL


Если я правильно понял смысл запихивания всего этого вот в pl/sql - не вылетать по exception в случае несуществующих даты или времени, типа 13-го месяца или 70-й минуты, или 30-го февраля.
...
Рейтинг: 0 / 0
Нужен ли здесь неявный курсор
    #39733863
ultrasonic7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне в данном случае не надо анализировать длину входного параметра. При передаче '10' выскакивает, по всей видимости, не VALUE_ERROR. Так всё работает правильно.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
FUNCTION VAL_DATE (iValue in varchar2) RETURN DATE AS
   cDateTimeMask constant varchar2 (21):='dd.mm.yyyy hh24:mi:ss';
   cDateMask constant varchar2 (21):='dd.mm.yyyy';
 BEGIN
   RETURN TO_DATE(iValue, cDateTimeMask);
 EXCEPTION WHEN OTHERS  THEN
   BEGIN
     RETURN TO_DATE(iValue, cDateMask);
   EXCEPTION WHEN OTHERS THEN
     RETURN NULL;
   END;  
 END;
...
Рейтинг: 0 / 0
Нужен ли здесь неявный курсор
    #39733864
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ultrasonic7При передаче '10' выскакивает, по всей видимости, не VALUE_ERROR.О! Не прошло и суток, заподозрил отличие ORA-06502 отultrasonic7 ORA-01840 : длина входного значения недостаточна для формата даты
Осталось еще несколько раз протереть спиртом оптическую ось, чтобы проявилась видимость нескольких сообщений о ненужности двух перехватов exception.
...
Рейтинг: 0 / 0
Нужен ли здесь неявный курсор
    #39733882
ultrasonic7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-,

Ну что вы прямо в таких резких выражениях? Не волнуйтесь так, видел я, да, не нужно два exception. Да, действительно, достаточно одной, длинной маски.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Нужен ли здесь неявный курсор
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]