Обычно при определении функции, масштаб/точность/размер типа данных возврата не определен.
Например, Вы говорите 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.
Никаких реальных недостатков, о которых я могу думать. Думаю, было бы немного понятнее, если бы рабочие переменные объявлялись как экземпляры подтипа, например:
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;
Делитесь и наслаждайтесь.