में नहीं है क्या CASE
और COALESCE()
के लिए प्रलेखन में वर्णित शॉर्ट-सर्किट मूल्यांकन SQL में उपयोग किए जाने पर अनुक्रमों पर लागू होता है? ऐसा प्रतीत नहीं होता है।केस और कोलेसे शॉर्ट-सर्किट मूल्यांकन पीएल/एसक्यूएल में अनुक्रमों के साथ काम करता है लेकिन एसक्यूएल
Oracle डाटाबेस शॉर्ट सर्किट मूल्यांकन का उपयोग करता है:
ओरेकल documentation on
CASE
जो यह बताता है। एक साधारणCASE
अभिव्यक्ति के लिए ... यदि पिछली तुलना_एक्सपी expr के बराबर है तो ओरेकल कभी तुलना_expr का मूल्यांकन नहीं करता है। एक खोजी गई CASE अभिव्यक्ति के लिए, डेटाबेस ... पिछली स्थिति सत्य होने पर कभी भी किसी शर्त का मूल्यांकन नहीं करती है।
इसी COALESCE()
the documentation कहा गया है कि के लिए:
Oracle डाटाबेस शॉर्ट सर्किट मूल्यांकन का उपयोग करता है। डेटाबेस प्रत्येक एक्सप्रप्रस मान का मूल्यांकन करता है और यह निर्धारित करता है कि उनमें से कोई भी पूर्ण है या नहीं, यह निर्धारित करने से पहले सभी एक्सप्रप्रस मूल्यों का मूल्यांकन करने के बजाय यह शून्य है या नहीं।
एसक्यूएल से अनुक्रम कॉल करते समय यह मामला प्रतीत नहीं होता है; जैसा कि आप देख सकते हैं कि कोई छोटा सर्किट नहीं होता है और अनुक्रम बढ़ता है।
SQL> create sequence tmp_test_seq start with 1 increment by 1;
SQL> select tmp_test_seq.nextval from dual;
NEXTVAL
----------
1
SQL> select tmp_test_seq.currval from dual;
CURRVAL
----------
1
SQL> select coalesce(1, tmp_test_seq.nextval) from dual;
COALESCE(1,TMP_TEST_SEQ.NEXTVAL)
--------------------------------
1
SQL> select tmp_test_seq.currval from dual;
CURRVAL
----------
2
SQL> select case when 1 = 1 then 1 else tmp_test_seq.nextval end as s from dual;
S
----------
1
SQL> select tmp_test_seq.currval from dual;
CURRVAL
----------
3
SQL> create sequence tmp_test_seq start with 1 increment by 1;
SQL> declare
2 i number;
3 begin
4 i := tmp_test_seq.nextval;
5 dbms_output.put_line(tmp_test_seq.currval);
6 i := coalesce(1, tmp_test_seq.nextval);
7 dbms_output.put_line(i);
8 dbms_output.put_line(tmp_test_seq.currval);
9 i := case when 1 = 1 then 1 else tmp_test_seq.nextval end;
10 dbms_output.put_line(i);
11 dbms_output.put_line(tmp_test_seq.currval);
12 end;
13/
1
1
1
1
1
SQL> select tmp_test_seq.nextval from dual;
NEXTVAL
----------
2
PL/SQL से एसक्यूएल में अनुक्रम कॉलिंग एक ही परिणाम के साथ के रूप में एसक्यूएल होता है::
हालांकि, जब PL/SQL से फोन कर अनुक्रम नहीं वृद्धि की जाती है
SQL> create sequence tmp_test_seq start with 1 increment by 1;
SQL> declare
2 i number;
3 begin
4 select tmp_test_seq.nextval into i from dual;
5 dbms_output.put_line(tmp_test_seq.currval);
6 select coalesce(1, tmp_test_seq.nextval) into i from dual;
7 dbms_output.put_line(i);
8 dbms_output.put_line(tmp_test_seq.currval);
9 select case when 1 = 1 then 1 else tmp_test_seq.nextval end into i
10 from dual;
11 dbms_output.put_line(i);
12 dbms_output.put_line(tmp_test_seq.currval);
13 end;
14/
1
1
2
1
3
इस बारे में प्रलेखन में कुछ भी प्रतीत नहीं होता है; the Administrator's guide for managing sequences, the SQL language reference on sequence psuedocolumns, the PL/SQL language reference on CURRVAL and NEXTVAL या the database concepts overview of sequences।
क्या एसएसएल में उपयोग किए जाने पर CASE
और COALESCE()
के शॉर्ट-सर्किट मूल्यांकन अनुक्रमों के लिए होते हैं? क्या यह दस्तावेज है?
यदि हम रुचि रखते हैं तो हम 11.2.0.3.5 पर हैं।
SQL सर्वर में परीक्षण। फ़ंक्शन के लिए अगला VALUE का उपयोग केस, चुनौती, कोल्स, आईआईएफ, इस्नुल और न्यूलिफ़ के भीतर नहीं किया जा सकता है। यह मुझे लगता है कि इससे बचने का एक तरीका है! –
यह मुझे लगता है कि मेटलिंक के लिए एक सवाल है। –
मुझे आश्चर्य होगा अगर किसी ने इससे पहले यह नहीं देखा ... @Alan। मैंने मेटलिंक पर 2331433 खोजने में कामयाब रहा है, जो समान (आईएसएच) दिखता है, लेकिन केवल केस पर और COALESCE नहीं। मुझे ओरेकल की प्रतिक्रिया भी पसंद है, वह सहायक नहीं है। – Ben