2010-06-01 34 views
7

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.

Trả lời

4

Không có bất kỳ hạn chế thực sự nào mà tôi có thể nghĩ đến. Tôi nghĩ rằng sẽ rõ ràng hơn một chút nếu các biến số hoạt động được khai báo là trường hợp của loại phụ, ví dụ:

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; 

Chia sẻ và thưởng thức.

+0

Vâng, mã mà trông sạch hơn và chỉ với một nơi để thay đổi chính xác. –

Các vấn đề liên quan