Точность интервала для значения функции PL / SQL - PullRequest
7 голосов
/ 01 июня 2010

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

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

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

Теперь я получаю ошибку точности (ORA-01873), если нажимаю 9999 часов (около 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;
/

Я могу использовать SUBTYPE

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.

Ответы [ 2 ]

4 голосов
/ 01 июня 2010

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

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; 

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

0 голосов
/ 06 ноября 2015

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

Это:

TIMESTAMP_UNCONSTRAINED
TIMESTAMP_TZ_UNCONSTRAINED
TIMESTAMP_LTZ_UNCONSTRAINED
YMINTERVAL_UNCONSTRAINED
DSINTERVAL_UNCONSTRAINED
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...