2010-06-01 11 views
7

Wenn Sie eine Funktion angeben, ist die Skalierung/Genauigkeit/Größe des Rückgabedatentyps im Allgemeinen nicht definiert.Genauigkeit des Intervalls für PL/SQL Funktionswert

Zum Beispiel sagen Sie FUNCTION show_price RETURN NUMBER oder FUNCTION show_name RETURN VARCHAR2.

Sie dürfen FUNCTION show_price RETURN NUMBER(10,2) oder FUNCTION show_name RETURN VARCHAR2(20) nicht haben und der Rückgabewert der Funktion ist nicht beschränkt. This is documented functionality.

Jetzt bekomme ich einen Präzisionsfehler (ORA-01873), wenn ich 9999 Stunden (etwa 400 Tage) in den folgenden drücken. Die Grenze ist da 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; 
/

und es wird die Genauigkeit angegeben werden direkt als Teil des Datentyps von der Funktion zurück nicht zulassen.

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; 
/

kann ich eine SUBTYPE verwenden

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; 
/

Irgendwelche Nachteile auf den Subtyp Ansatz?

Alle Alternativen (z. B. ein Ort, um eine Standardgenauigkeit zu ändern)?

Arbeiten mit 10gR2.

Antwort

4

Keine wirklichen Nachteile, die ich mir vorstellen kann. Ich denke, es wäre ein bisschen mehr klar sein, wenn die Arbeitsvariablen als Instanzen des Subtyps declarred wurden, z.B .:

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; 

teilen und genießen.

+0

Ja, das Code sauberer und mit nur einem Ort sieht die Präzision zu ändern. –