Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / прошу помощи сообщества. / 5 сообщений из 5, страница 1 из 1
14.03.2017, 12:00
    #39418736
saxarock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
прошу помощи сообщества.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
CREATE OR REPLACE FUNCTION get_num_hour(
    data_in DATE)
  RETURN NUMBER
IS
  CURSOR big_data
  IS
    SELECT DISTINCT
      CASE
        WHEN to_date (TO_CHAR ( MAX(data_in) OVER (PARTITION BY TRUNC(data_in,
          'DD'), SUBSTR(who_is, 1, instr(Who_is, '.')) ), 'HH24:MI:SS'),
          'HH24:MI:SS') <= to_date ('17:46:00', 'HH24:MI:SS')
        THEN 0
        ELSE to_number(floor((((to_number( to_date(TO_CHAR(MAX(data_in)OVER(
          PARTITION BY TRUNC(data_in, 'DD'),SUBSTR(who_is, 1, instr(Who_is, '.'
          )) ), 'HH24:MI:SS'), 'HH24:MI:SS') - to_date ('17:30:00',
          'HH24:MI:SS'))                     *1440 ))/ 60)) )
      END hours,
      CASE
        WHEN to_date (TO_CHAR ( MAX(data_in) OVER (PARTITION BY TRUNC(data_in,
          'DD'), SUBSTR(who_is, 1, instr(Who_is, '.')) ), 'HH24:MI:SS'),
          'HH24:MI:SS') <= to_date ('17:46:00', 'HH24:MI:SS')
        THEN 0
        ELSE to_number(EXTRACT(MINUTE FROM NUMTODSINTERVAL((to_date (TO_CHAR (
          MAX(data_in) OVER (PARTITION BY TRUNC(data_in, 'DD'), SUBSTR(who_is,
          1, instr(Who_is, '.')) ), 'HH24:MI:SS'), 'HH24:MI:SS') - to_date (
          '17:30:00', 'HH24:MI:SS') )                            *1440,'MINUTE'
          )))
      END minutes
    FROM
      pr_t_g
    WHERE
      TRUNC (data_in, 'DD') NOT IN ( to_date ('04.02.2017 00:00:00',
      'dd.mm.yyyy hh24:mi:ss'), to_date ('05.02.2017 00:00:00',
      'dd.mm.yyyy hh24:mi:ss'), to_date ('11.02.2017 00:00:00',
      'dd.mm.yyyy hh24:mi:ss'), to_date ('12.02.2017 00:00:00',
      'dd.mm.yyyy hh24:mi:ss'), to_date ('18.02.2017 00:00:00',
      'dd.mm.yyyy hh24:mi:ss'), to_date ('19.02.2017 00:00:00',
      'dd.mm.yyyy hh24:mi:ss'), to_date ('25.02.2017 00:00:00',
      'dd.mm.yyyy hh24:mi:ss'), to_date ('26.02.2017 00:00:00',
      'dd.mm.yyyy hh24:mi:ss') ) ;
TYPE hourstab IS   TABLE OF big_data%rowtype;
  v_hoursandminutes hourstab;
  cnumber NUMBER;
BEGIN
  OPEN big_data;
  FETCH
    big_data bulk collect
  INTO
    v_hoursandminutes;
  CLOSE big_data;
  FOR i IN v_hoursandminutes.first..v_hoursandminutes.last
  LOOP
    IF v_hoursandminutes(i).minutes < 15
      THEN
      cnumber := to_number (v_hoursandminutes(i).hours);
      /*elsif v_hoursandminutes(i).minutes >= 45
      then cnumber := v_hoursandminutes(i).hours + 1;
      elsif v_hoursandminutes(i).minutes >= 16
      then cnumber := v_hoursandminutes(i).hours + 0.5;*/
    ELSE
      NULL;
    END IF;
  END LOOP;
  RETURN cnumber;
EXCEPTION
WHEN OTHERS THEN
  raise_application_error(-20001,'An error was encountered - ##'||SQLCODE||
  '## -ERROR- ##'||SQLERRM);
END;



При вызове функции получаю
Код: plsql
1.
 ORA-20001: An error was encountered - ##-6502## -ERROR- ##ORA-06502: PL/SQL: numeric or value error


просьба пояснить (кому не лень), что сделано не так?
...
Рейтинг: 0 / 0
14.03.2017, 12:02
    #39418740
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
прошу помощи сообщества.
saxarockпросьба пояснить (кому не лень), что сделано не так?Убери свой бесполезный обработчик ошибок, и Oracle сам скажет тебе, в какой строке.
...
Рейтинг: 0 / 0
14.03.2017, 12:08
    #39418753
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
прошу помощи сообщества.
saxarock
Код: plsql
1.
to_date ('04.02.2017 00:00:00', 'dd.mm.yyyy hh24:mi:ss')

RTFM Date Literal
saxarock
Код: plsql
1.
2.
bulk collect
  FOR i IN v_hoursandminutes.first..v_hoursandminutes.last

Для гарантированно неразряженных коллекций есть безопасный и более короткий способ итерирования, не приводящий к подобной ошибке.
...
Рейтинг: 0 / 0
14.03.2017, 12:11
    #39418756
saxarock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
прошу помощи сообщества.
Elic,

спс, валится вот здесь
Код: plsql
1.
 FOR i IN v_hoursandminutes.first..v_hoursandminutes.last




Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
ORA-06502: PL/SQL: numeric or value error
ORA-06512: at "M.GET_NUM_HOUR", line 50
06502. 00000 -  "PL/SQL: numeric or value error%s"
*Cause:    An arithmetic, numeric, string, conversion, or constraint error
           occurred. For example, this error occurs if an attempt is made to
           assign the value NULL to a variable declared NOT NULL, or if an
           attempt is made to assign an integer larger than 99 to a variable
           declared NUMBER(2).
*Action:   Change the data, how it is manipulated, or how it is declared so
           that values do not violate constraints.



продолжу ковырять..
...
Рейтинг: 0 / 0
14.03.2017, 12:40
    #39418794
saxarock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
прошу помощи сообщества.
Elicsaxarock
Код: plsql
1.
to_date ('04.02.2017 00:00:00', 'dd.mm.yyyy hh24:mi:ss')

RTFM Date Literal

Поправил.

Elicsaxarock
Код: plsql
1.
2.
bulk collect
  FOR i IN v_hoursandminutes.first..v_hoursandminutes.last

Для гарантированно неразряженных коллекций есть безопасный и более короткий способ итерирования, не приводящий к подобной ошибке.

Думаю так норм
Код: plsql
1.
FOR i IN 1..v_hoursandminutes.count

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


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