Ogólnie, po określeniu funkcji, skala/precyzja/rozmiar zwracanego typu danych jest niezdefiniowana. Na przykład: FUNCTION show_price RETURN NUMBER
lub FUNCTION show_name RETURN VARCHAR2
.Precyzja interwału dla PL/SQL Wartość funkcji
Nie możesz mieć FUNCTION show_price RETURN NUMBER(10,2)
ani FUNCTION show_name RETURN VARCHAR2(20)
, a funkcja zwraca wartość bez ograniczeń. This is documented functionality.
Teraz dostaję błąd precyzji (ORA-01873), jeśli popchnę 9999 godzin (około 400 dni) do następnej. Limit dlatego the default days precision is 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;
/
i nie pozwoli precyzja być określone bezpośrednio w ramach typów danych zwracanej przez funkcję.
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;
/
mogę użyć podtyp
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;
/
jakieś wady podejścia podtypu?
Jakieś alternatywy (np. Miejsce do zmiany domyślnej precyzji)?
Praca z 10gR2.
Tak, że kod wygląda czystsze i tylko z jednego miejsca do zmiany precyzji. –