2010-06-01 12 views
7

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.

Odpowiedz

4

Brak prawdziwych wad, które mogę wymyślić. Myślę, że byłoby nieco bardziej jasne, czy zmienne robocze declarred jako instancje podtypu, np .:

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; 

Podziel się i cieszyć.

+0

Tak, że kod wygląda czystsze i tylko z jednego miejsca do zmiany precyzji. –