Точность Интервала для МН Значения функции / Значения функции SQL

Обычно при определении функции, масштаб/точность/размер типа данных возврата не определен.

Например, Вы говорите FUNCTION show_price RETURN NUMBER или FUNCTION show_name RETURN VARCHAR2.

Нельзя иметь FUNCTION show_price RETURN NUMBER(10,2) или FUNCTION show_name RETURN VARCHAR2(20), и функциональное возвращаемое значение неограниченно. Это - зарегистрированная функциональность.

Теперь, я получаю ошибку точности (РТЫ 01873), если я продвигаю 9 999 часов (приблизительно 400 дней) в следующее. Предел - то, потому что дневная точность по умолчанию равняется 2

DECLARE
  v_int INTERVAL DAY (4) TO SECOND(0);
  FUNCTION hhmm_to_interval return INTERVAL DAY TO SECOND IS
    v_hhmm INTERVAL DAY (4) TO SECOND(0);
  BEGIN
    v_hhmm := to_dsinterval('PT9999H');
    RETURN v_hhmm;
    --
  END hhmm_to_interval;
BEGIN
  v_int := hhmm_to_interval;
end;
/

и это не позволит точности быть указанной непосредственно как часть типа данных, возвращенного функцией.

DECLARE
  v_int INTERVAL DAY (4) TO SECOND(0);
  FUNCTION hhmm_to_interval return INTERVAL DAY (4) TO SECOND IS
    v_hhmm INTERVAL DAY (4) TO SECOND(0);
  BEGIN
    v_hhmm := to_dsinterval('PT9999H');
    RETURN v_hhmm;
    --
  END hhmm_to_interval;
BEGIN
  v_int := hhmm_to_interval;
end;
/

Я могу использовать ПОДТИП

DECLARE
  subtype t_int is INTERVAL DAY (4) TO SECOND(0);
  v_int INTERVAL DAY (4) TO SECOND(0);
  FUNCTION hhmm_to_interval return t_int IS
    v_hhmm INTERVAL DAY (4) TO SECOND(0);
  BEGIN
    v_hhmm := to_dsinterval('PT9999H');
    RETURN v_hhmm;
    --
  END hhmm_to_interval;
BEGIN
  v_int := hhmm_to_interval;
end;
/

Какие-либо недостатки к подходу подтипа?

Какие-либо альтернативы (например, некоторое место для изменения точности по умолчанию)?

Работа с 10gR2.

7
задан Gary Myers 1 June 2010 в 05:44
поделиться

1 ответ

Никаких реальных недостатков, о которых я могу думать. Думаю, было бы немного понятнее, если бы рабочие переменные объявлялись как экземпляры подтипа, например:

DECLARE 
  subtype t_int is INTERVAL DAY (4) TO SECOND(0);

  v_int t_int;

  FUNCTION hhmm_to_interval return t_int IS 
    v_hhmm t_int; 
  BEGIN 
    v_hhmm := to_dsinterval('PT9999H'); 
    RETURN v_hhmm; 
  END hhmm_to_interval; 

BEGIN 
  v_int := hhmm_to_interval;
  DBMS_OUTPUT.PUT_LINE('v_int=' || v_int);
end; 

Делитесь и наслаждайтесь.

4
ответ дан 7 December 2019 в 14:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: