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.
Ja, das Code sauberer und mit nur einem Ort sieht die Präzision zu ändern. –