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.
Sí, ese código se ve más limpia y con sólo un lugar para cambiar la precisión. –