2012-03-07 12 views
7

मुझे केवल डीएमएल एक्सेस के साथ अनुक्रमों का एक सेट अग्रेषित करने की आवश्यकता है। कोड के एक टुकड़े में एक बग के कारण कई मूल्य अनुक्रम के बिना पकड़े गए थे, बल्कि मैन्युअल रूप से, इसलिए अब अनुक्रम उन मानों को डुप्लिकेट कर रहा है। इसलिए, मैं अनुक्रम को अधिकतम मान पर धक्का देना चाहता हूं ताकि अगली बार अगली बार कहा जा सके, यह अधिकतम से अधिक मान देता है। मुझे लगभग 50 अनुक्रम मिल गए हैं जिन्हें प्रत्येक को कुछ हज़ार आगे जाना है।मैन्युअल रूप से एक अनुक्रम अग्रेषित करें - ऑरैकल एसक्यूएल

क्या यह केवल डीएमएल पहुंच के साथ संभव है? यदि हां, तो मुझे इसके बारे में कैसे जाना चाहिए?

उत्तर

8

ऐसा करने के लिए गतिशील एसक्यूएल का उपयोग कर सकते कर सकते हैं। उदाहरण के लिए, कोड का यह बिट अनुक्रमों की सूची में से प्रत्येक के अगले 10,000 मानों का चयन करेगा।

DECLARE 
    l_num INTEGER; 
BEGIN 
    FOR seq IN (select * 
       from all_sequences 
       where sequence_name in (<<list of 50 sequences>>) 
        and sequence_owner = <<owner of sequences>>) 
    LOOP 
    FOR i IN 1 .. 10000 
    LOOP 
     execute immediate 
     'select ' || seq.sequence_owner || '.' || seq.sequence_name || '.nextval from dual' 
     into l_num; 
    END LOOP; 
    END LOOP; 
END; 

यदि आप अनुक्रम के खिलाफ DDL जारी करने की क्षमता थी, आप INCREMENT 10,000 करने के लिए सेट करने के लिए एक समान दृष्टिकोण इस्तेमाल कर सकते हैं, अनुक्रम से एक मान चुनें, INCREMENT वापस 1 पर सेट नीचे (या जो भी यह अभी है)।

+0

यह शानदार है। मैं स्वचालित रूप से ऐसा करने के लिए प्रासंगिक कॉलम के अधिकतम मान से अनुक्रम के अगले मान को घटाकर प्रत्येक अनुक्रम के लिए आवश्यक लूप की संख्या की गणना कर सकता हूं। मुझे एहसास नहीं हुआ कि एसक्यूएल की ऐसी कार्यक्षमता थी। धन्यवाद! – Jeremy

2

तुम सिर्फ

select seq.nextval from dual 

जब तक यह काफी बड़ा है ...

+0

मुझे लगभग 50 अनुक्रम मिला है जिन्हें प्रत्येक को कुछ हज़ार आगे जाना है। – Jeremy

+0

क्या आप पीएलएसक्यूएल चला सकते हैं? – Randy

1

एक अलग मूल्य पर अनुक्रम को पुनरारंभ करने के लिए आपको इसे छोड़ने और इसे फिर से बनाने की आवश्यकता है।

ALTER SEQUENCEhere के लिए ओरेकल दस्तावेज़ देखें।

और CREATE SEQUENCEhere

तो के लिए, कोई मैं इसे, DML उपयोग के साथ संभव है, जब तक आप बस बार-बार बढ़ाने के रैंडी पता चलता है की तरह नहीं लगता।

4

आपको अनुक्रम और आवश्यक मान के अगले मूल्य के बीच का अंतर निर्धारित करना चाहिए। आवश्यक मान आमतौर पर प्राथमिक कुंजी कॉलम का अधिकतम मान होता है (चलो इसे आईडी नाम दें)।

DECLARE 
    maxid NUMBER; 
    maxseq NUMBER; 
    temp NUMBER; -- without this variable Oracle would skip to query the sequence 
BEGIN 
    SELECT MAX(ID) INTO maxid FROM MYTABLE; 
    SELECT MYSEQ.NEXTVAL INTO maxseq FROM DUAL; 
    FOR i IN maxseq .. maxid LOOP 
     SELECT MYSEQ.NEXTVAL INTO temp FROM DUAL; 
    END LOOP; 
END; 
/
1

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

SELECT seq1.nextval, seq2.nextval, ..., seqN.nextval 
    FROM very_large_table 
WHERE ROWNUM <= number_of_rows_to_add 
संबंधित मुद्दे