यह उस तरह की स्थिति है जहां कुछ प्रयोग उपयोगी होते हैं (यह 10g पर आयोजित किया गया था)। निम्नलिखित क्वेरी का उपयोग करके, हम बता सकते हैं कि समान पैरामीटर (इस मामले में, कोई नहीं) का उपयोग करके सामान्य कार्यों को हर बार कॉल किए जाने पर निष्पादित किया जाएगा:
select dbms_random.value() from all_tables
ऐसा इसलिए है क्योंकि Oracle मानता है कि कोई फ़ंक्शन समान मान को तब तक लगातार वापस नहीं करेगा जब तक कि आप इसे अन्यथा नहीं बताते। हम निर्धारक
. का उपयोग करके एक फ़ंक्शन बनाकर ऐसा कर सकते हैं कीवर्ड:
CREATE FUNCTION rand_det
RETURN NUMBER
DETERMINISTIC AS
BEGIN
RETURN DBMS_RANDOM.VALUE ();
END;
dbms_random
के बजाय इस फ़ंक्शन का उपयोग करना पहली क्वेरी में हमें बताता है कि कई कॉलों के बावजूद क्वेरी को केवल एक बार निष्पादित किया जा रहा है। लेकिन यह केवल चयन
. को स्पष्ट करता है खंड। क्या होगा यदि हम चयन
. दोनों में एक ही नियतात्मक फलन का उपयोग करते हैं और एक कहां
खंड। हम निम्न क्वेरी का उपयोग करके इसका परीक्षण कर सकते हैं:
SELECT rand_det
FROM all_tables
WHERE rand_det > .5;
हमारे प्रमाण को देखने के लिए आपको इसे कई बार चलाना पड़ सकता है, लेकिन, अंततः, आपको 0.5 से कम मानों की एक सूची दिखाई देगी। यह हमें इस बात का प्रमाण प्रदान करता है कि नियतात्मक कार्य भी दो बार निष्पादित किया जा रहा है:एक बार प्रत्येक अनुभाग के लिए यह दिखाई देता है। एक विकल्प के रूप में, आप हमारे नियतात्मक कार्य को निम्नानुसार संशोधित कर सकते हैं, फिर बाद की क्वेरी को चला सकते हैं, जो <को लिखी गई 2 पंक्तियों को प्रकट करेगा। कोड>DBMS_OUTPUT ।
CREATE OR REPLACE FUNCTION rand_det
RETURN NUMBER
DETERMINISTIC AS
BEGIN
DBMS_OUTPUT.put_line ('Called!');
RETURN DBMS_RANDOM.VALUE ();
END;
SELECT rand_det
FROM all_tables;