Как правило, при указании функции масштаб / точность / размер возвращаемого типа данных не определен.
Например, вы говорите 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.