2010-06-01 26 views
7

के लिए अंतराल की प्रेसिजन आम तौर पर, जब आप कोई फ़ंक्शन निर्दिष्ट करते हैं तो रिटर्न डेटाटाइप का स्केल/सटीक/आकार अपरिभाषित होता है।पीएल/एसक्यूएल फंक्शन मान

उदाहरण के लिए, आप FUNCTION show_price RETURN NUMBER या FUNCTION show_name RETURN VARCHAR2 कहते हैं।

आप FUNCTION show_price RETURN NUMBER(10,2) या FUNCTION show_name RETURN VARCHAR2(20) है की अनुमति नहीं है, और समारोह वापसी मान अप्रतिबंधित है। This is documented functionality.

अब, मुझे एक सटीक त्रुटि (ओआरए -01873) मिलती है यदि मैं निम्नलिखित में 99 99 घंटे (लगभग 400 दिन) दबाता हूं। सीमा क्योंकि 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; 
/

है और यह सटीक डेटाप्रकार समारोह से वापस लौटे के हिस्से के रूप सीधे निर्दिष्ट करने की अनुमति नहीं दी जाएगी।

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

मैं एक 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; 
/

उप प्रकार दृष्टिकोण करने के लिए किसी भी कमियां उपयोग कर सकते हैं?

कोई विकल्प (उदाहरण के लिए एक डिफ़ॉल्ट परिशुद्धता बदलने के लिए कुछ जगह)?

10 जीआर 2 के साथ काम करना।

उत्तर

4

कोई वास्तविक कमी जो मैं सोच सकता हूं। मुझे लगता है कि यह थोड़ा और अधिक स्पष्ट हो सकता है अगर काम कर रहे चर उप-प्रकार के उदाहरण के रूप में declarred रहे थे, उदा .:

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; 

साझा करें और आनंद लें।

+0

हां, यह कोड क्लीनर और सिर्फ एक जगह परिशुद्धता बदलने के लिए के साथ लग रहा है। –

0

ओरेकल कुछ निर्माण में उप-प्रकारों में प्रावधान है कि इस प्रयोजन के लिए, Avoiding Truncation Problems Using Date and Time Subtypes

देख वे हैं:

TIMESTAMP_UNCONSTRAINED 
TIMESTAMP_TZ_UNCONSTRAINED 
TIMESTAMP_LTZ_UNCONSTRAINED 
YMINTERVAL_UNCONSTRAINED 
DSINTERVAL_UNCONSTRAINED 
संबंधित मुद्दे