बिना इंक्रीमेंट के ओरेकल सीक्वेंस के वर्तमान मूल्य को कैसे पुनः प्राप्त किया जाए?


156

क्या किसी अनुक्रम के मूल्य को पुनः प्राप्त करने के लिए एक SQL निर्देश है जो इसे नहीं बढ़ाता है।

धन्यवाद।

संपादित करें और निष्कर्ष

जैसा कि जस्टिन केव ने कहा था कि अनुक्रम संख्या को "सेव" करने की कोशिश करना उपयोगी नहीं है

select a_seq.nextval from dual;

एक अनुक्रम मान की जांच करने के लिए पर्याप्त अच्छा है।

मैं अभी भी ओली के उत्तर को अच्छे के रूप में रखता हूं क्योंकि यह प्रारंभिक प्रश्न का उत्तर देता है। लेकिन अपने आप से अनुक्रम को संशोधित करने की आवश्यकता के बारे में पूछें यदि आप कभी भी ऐसा करना चाहते हैं।


5
क्यों? आप जिस समस्या को हल करने की कोशिश कर रहे हैं, वह क्या है? यदि आप अनुक्रमों का सही उपयोग कर रहे हैं, तो आपको कभी भी परवाह नहीं करनी चाहिए कि अन्य सत्रों को कौन से अनुक्रम मान सौंपे गए हैं या बाद के सत्रों के लिए कौन से मान निर्दिष्ट किए जा सकते हैं।
जस्टिन गुफा

3
डेटा माइग्रेशन के बाद यह जाँच है कि यह सुनिश्चित किया जाए कि माइग्रेट किए गए डेटा के अनुसार अनुक्रम को सही ढंग से अपडेट किया गया है
frno

3
तो फिर बस nextvalपरीक्षण करने के लिए अनुक्रम प्राप्त करने के लिए नकारात्मक पक्ष क्या है ? आप यह नहीं मान रहे हैं कि अनुक्रम अंतराल-मुक्त होंगे, है ना? तो एक क्रम मूल्य "बर्बाद" एक मुद्दा नहीं होना चाहिए।
जस्टिन गुफा

मुझे लगता है कि आप सही हैं, मैं उस जाँच के लिए db की स्थिति को बदलना नहीं चाहता था, लेकिन ईमानदार होने के लिए मुझे पता नहीं क्यों। आपकी जानकारी के लिए धन्यवाद। फिर भी मैंने अनुक्रम के बारे में आपका सामान सीखा, आप सभी को धन्यवाद!
फ्रेंको

मान लें कि आप मज़बूती से एक अनुक्रम का मूल्य प्राप्त कर सकते हैं, तो आपका कौन सा आभूषण है जिसके खिलाफ आप जाँच रहे हैं कि अनुक्रम ठीक से अपडेट किया गया है?
शैनन सेवरेंस

जवाबों:


173
SELECT last_number
  FROM all_sequences
 WHERE sequence_owner = '<sequence owner>'
   AND sequence_name = '<sequence_name>';

आप कई प्रकार के अनुक्रम मेटाडेटा से प्राप्त कर सकते हैं user_sequences, all_sequencesऔर dba_sequences

ये दृश्य सत्रों में काम करते हैं।

संपादित करें:

यदि अनुक्रम आपके डिफ़ॉल्ट स्कीमा में है तो:

SELECT last_number
  FROM user_sequences
 WHERE sequence_name = '<sequence_name>';

यदि आप सभी मेटाडेटा चाहते हैं तो:

SELECT *
  FROM user_sequences
 WHERE sequence_name = '<sequence_name>';

आशा करता हूँ की ये काम करेगा...

EDIT2:

यदि आपके कैश आकार 1 नहीं है तो इसे अधिक विश्वसनीय तरीके से करने का एक लंबा घुमावदार तरीका है:

SELECT increment_by I
  FROM user_sequences
 WHERE sequence_name = 'SEQ';

      I
-------
      1

SELECT seq.nextval S
  FROM dual;

      S
-------
   1234

-- Set the sequence to decrement by 
-- the same as its original increment
ALTER SEQUENCE seq 
INCREMENT BY -1;

Sequence altered.

SELECT seq.nextval S
  FROM dual;

      S
-------
   1233

-- Reset the sequence to its original increment
ALTER SEQUENCE seq 
INCREMENT BY 1;

Sequence altered.

बस इस बात से सावधान रहें कि यदि अन्य लोग इस समय के दौरान अनुक्रम का उपयोग कर रहे हैं - वे (या आप) प्राप्त कर सकते हैं

ORA-08004: sequence SEQ.NEXTVAL goes below the sequences MINVALUE and cannot be instantiated

इसके अलावा, आप कैश को NOCACHEरीसेट करने से पहले सेट करना चाहते हैं और फिर बाद में अपने मूल मूल्य पर वापस आ सकते हैं ताकि यह सुनिश्चित कर सकें कि आपने बहुत सारे मानों को कैश नहीं किया है।


बस यह कोशिश की, लेकिन मैं एक 'all_fterences' तालिका तक पहुँच नहीं है। क्या यह एक विशेष वस्तु है जिसे आप केवल व्यवस्थापक क्रेडेंशियल्स के साथ देखते हैं?
फ्रानो

1
ALL_SEQUENCESएक दृश्य है। यदि आपके पास इसकी पहुंच नहीं है, तो USER_SEQUENCESयदि आपके डिफ़ॉल्ट स्कीमा में अनुक्रम है, तो इसका चयन करने का प्रयास करें। (आपको इसके लिए sequence_owner = '<sequence_owner>'क्लॉज़ की आवश्यकता नहीं होगी USER_SEQUENCES)।
ओली

15
LAST_NUMBERमें ALL_SEQUENCESपिछले संख्या नहीं होगा कि एक सत्र वास्तव में दिया गया था तथा उस नंबर के लिए एक कॉल से लौटा दिया जाएगा नहीं होगा sequence_name.nextvalसामान्य रूप में। मान लें कि आपने अनुक्रम को CACHE1 से अधिक पर सेट किया है (डिफ़ॉल्ट 20 है), LAST_NUMBERकैश में अंतिम संख्या होगी। इस बात की कोई गारंटी नहीं है कि यह संख्या वास्तव में किसी भी सत्र के लिए दी जाएगी।
जस्टिन केव

2
ALTER SEQUENCE seq INCREMENT BY -1;जब तक कोई यह गारंटी नहीं दे सकता कि कोई अन्य सत्र नहीं बुलाएगा seq.nextval। अन्यथा अनुक्रम डुप्लिकेट मानों को सौंप देगा, जो आमतौर पर कोई भी नहीं चाहता है।
शैनन सेवरेंस

1
ओपी ने कहा कि "यह डेटा माइग्रेशन के बाद की जांच है" इसलिए यह मानने के लिए एक खिंचाव नहीं है कि डीबी सामान्य उपयोग में नहीं है, लेकिन अगर यह मामला नहीं था तो यह एक मुद्दा हो सकता है।
ओली

122

select MY_SEQ_NAME.currval from DUAL;

ध्यान रखें कि यह केवल तभी काम करता है जब आप select MY_SEQ_NAME.nextval from DUAL;वर्तमान सत्रों में चले ।


1
आपके उत्तर के लिए एक गुच्छा धन्यवाद। मुझे इसे Boomi के अंदर उपयोग करना है और ऊपर-नीचे एक समाधान की तलाश में है
सीखने ...

0

मेरा मूल उत्तर तथ्यात्मक रूप से गलत था और मुझे खुशी है कि इसे हटा दिया गया। नीचे दिए गए कोड निम्नलिखित शर्तों के तहत काम करेंगे a) आप जानते हैं कि किसी और ने अनुक्रम बी को संशोधित नहीं किया है) आपके सत्र द्वारा अनुक्रम को संशोधित किया गया था। मेरे मामले में, मुझे एक समान मुद्दे का सामना करना पड़ा जहां मैं एक ऐसी प्रक्रिया को बुला रहा था जो एक मूल्य को संशोधित करता है और मुझे विश्वास है कि यह धारणा सही है।

SELECT mysequence.CURRVAL INTO v_myvariable FROM DUAL;

अफसोस की बात है कि यदि आपने अपने सत्र में अनुक्रम को संशोधित नहीं किया है, तो मेरा मानना ​​है कि अन्य लोग यह बताते हुए सही हैं कि NEXTVAL जाने का एकमात्र तरीका है।


0

यह एक उत्तर नहीं है, वास्तव में और मैंने इसे दर्ज किया होगा क्योंकि एक टिप्पणी में सवाल बंद नहीं किया गया था। यह सवाल का जवाब देता है:

आप इसे क्यों चाहेंगे?

मान लें कि आपके पास अनुक्रम के साथ एक तालिका है जैसा कि प्राथमिक कुंजी और अनुक्रम एक सम्मिलित ट्रिगर द्वारा उत्पन्न होता है। यदि आप रिकॉर्ड के बाद के अपडेट के लिए अनुक्रम उपलब्ध करना चाहते हैं, तो आपको उस मान को निकालने का एक तरीका होना चाहिए।

यह सुनिश्चित करने के लिए कि आपको सही मिल रहा है, आप लेन-देन में INSERT और RonK की क्वेरी को लपेटना चाह सकते हैं।

रॉन की क्वेरी:

select MY_SEQ_NAME.currval from DUAL;

उपरोक्त परिदृश्य में, रोंक के कैविट इंसर्ट के बाद से लागू नहीं होते हैं और अपडेट उसी सत्र में होता है।


0

मैंने अपने मामले में CURRVAL का उपयोग करने की कोशिश की, यह जानने के लिए कि क्या किसी प्रक्रिया ने प्राथमिक कुंजी के रूप में उस अनुक्रम के साथ कुछ तालिका में नई पंक्तियाँ सम्मिलित की हैं। मेरी धारणा यह थी कि CURRVAL सबसे तेज विधि होगी। लेकिन एक) CurrVal काम नहीं करता है, यह सिर्फ पुराने मूल्य को प्राप्त करेगा क्योंकि आप एक और ओरेकल सत्र में हैं, जब तक आप अपने सत्र में एक NEXTVAL नहीं करते हैं। और b) a select max(PK) from TheTableभी बहुत तेज है, शायद इसलिए कि एक PK हमेशा अनुक्रमित होता है। या select count(*) from TheTable। मैं अभी भी प्रयोग कर रहा हूं, लेकिन दोनों चयन तेजी से लगते हैं।

मुझे एक सीक्वेंस में कोई अंतर नहीं है, लेकिन मेरे मामले में मैं बहुत अधिक मतदान करने के बारे में सोच रहा था, और मुझे बहुत बड़े अंतराल के विचार से नफरत होगी। खासकर अगर एक सरल चयन बस के रूप में तेजी से होगा।

निष्कर्ष:

  • CURRVAL बहुत बेकार है, क्योंकि यह एक और सत्र से NEXTVAL का पता नहीं लगाता है, यह केवल वही देता है जो आप पहले से ही अपने पिछले NEXTVAL से जानते थे
  • Select MAX (...) FROM ... एक अच्छा उपाय है, सरल और तेज, यह मानते हुए कि आपका अनुक्रम उस तालिका से जुड़ा हुआ है
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.