2010-06-01 11 views
7

Generalmente, cuando especifica una función, la escala/precisión/tamaño del tipo de datos de retorno no está definida.Precisión de intervalo para PL/SQL Valor de función

Por ejemplo, usted dice FUNCTION show_price RETURN NUMBER o FUNCTION show_name RETURN VARCHAR2.

No tiene permiso para tener FUNCTION show_price RETURN NUMBER(10,2) o FUNCTION show_name RETURN VARCHAR2(20), y la función return value no tiene restricciones. This is documented functionality.

Ahora, obtengo un error de precisión (ORA-01873) si presiono 9999 horas (alrededor de 400 días) en lo siguiente. El límite se debe a 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; 
/

y que no permitirá que la precisión sea especificado directamente como parte del tipo de datos devuelto por la función.

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

puedo utilizar un subtipo

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

Algún inconveniente con el enfoque subtipo?

¿Alguna alternativa (por ejemplo, algún lugar para cambiar una precisión predeterminada)?

Trabajando con 10gR2.

Respuesta

4

No hay inconvenientes reales que se me ocurra. Creo que sería un poco más claro si las variables de trabajo se declarred como ejemplos del subtipo, por ejemplo .:

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; 

compartir y disfrutar.

+0

Sí, ese código se ve más limpia y con sólo un lugar para cambiar la precisión. –