Nói chung, khi bạn chỉ định một hàm, tỷ lệ/độ chính xác/kích thước của kiểu dữ liệu trả về là không xác định.Độ chính xác khoảng thời gian cho giá trị hàm PL/SQL
Ví dụ: bạn nói FUNCTION show_price RETURN NUMBER
hoặc FUNCTION show_name RETURN VARCHAR2
.
Bạn không được phép có FUNCTION show_price RETURN NUMBER(10,2)
hoặc FUNCTION show_name RETURN VARCHAR2(20)
và giá trị trả lại hàm không bị giới hạn. This is documented functionality.
Bây giờ, tôi gặp lỗi chính xác (ORA-01873) nếu tôi đẩy 9999 giờ (khoảng 400 ngày) vào các mục sau đây. Giới hạn là vì 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;
/
và nó sẽ không cho phép độ chính xác được xác định trực tiếp như một phần của kiểu dữ liệu trả về bởi hàm.
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;
/
tôi có thể sử dụng một SUBTYPE
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;
/
Bất kỳ trở ngại đối với cách tiếp cận kiểu phụ?
Bất kỳ giải pháp thay thế nào (ví dụ: một số nơi để thay đổi độ chính xác mặc định)?
Làm việc với 10gR2.
Vâng, mã mà trông sạch hơn và chỉ với một nơi để thay đổi chính xác. –