2012-03-07 35 views
7

Sadece DML erişimi olan bir dizi diziyi iletmem gerekiyor. Bir kod parçasındaki bir hata nedeniyle, birkaç değer bir sıra olmaksızın elde edildi, ancak bunun yerine el ile yapıldı, böylece sıra bu değerleri çoğaltır. Bu yüzden, sıralamayı bir sonraki zaman dilimine çağırmak için sırayı maksimum değere itmek istiyorum, maksimumdan daha yüksek bir değer verir. Her birinin birkaç bin ileri gitmesi gereken yaklaşık 50 dizim var.Bir sıralamayı iletme - oracle sql

Bu yalnızca DML erişimi ile mümkün mü? Eğer öyleyse, bunun için nasıl gitmeliyim?

cevap

8

Bunu yapmak için dinamik SQL de kullanabilirsiniz. Örneğin, bu kod biraz, bir dizi listenin her birinden sonraki 10.000 değeri seçecektir. Eğer dizinin karşı DDL sorunu yeteneği olsaydı

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; 

, sen dizisinden bir değeri seçin INCREMENT 10.000 ayarlamak için benzer bir yaklaşım kullanabilir ve 1 olarak tekrar aşağı INCREMENT set (veya ne olursa olsun şimdi).

+0

Bu harika. Her bir dizi için gereken döngü sayısını, dizinin bir sonraki değerini otomatik olarak yapmak için ilgili sütunun maksimum değerinden çıkartarak hesaplayabilirim. Sql böyle bir işleve sahip olduğunu bilmiyordum. Teşekkür ederim! – Jeremy

2

sadece

select seq.nextval from dual 

o kadar büyük olana kadar ...

+0

Her birinin birkaç bin ileri gitmesi gereken yaklaşık 50 dizim var. – Jeremy

+0

PLSQL'i çalıştırabilir misiniz? – Randy

1

Sıralamayı farklı bir değerde yeniden başlatmak için onu düşürmeniz ve yeniden oluşturmanız gerekir.

ALTER SEQUENCEhere için Oracle belgelerine bakın.

Ve Yani CREATE SEQUENCEhere

için

, hayır Randy anlaşılacağı gibi sadece tekrar tekrar artırmak sürece, DML erişimi mümkün olduğunu sanmıyorum.

4

Sıranın bir sonraki değeri ile gerekli değer arasındaki farkı belirlemelisiniz. Gerekli değer, tipik olarak bir birincil anahtar sütununun maksimum değeridir (kimliğine isim verelim). Eğer dizileri eklemek istediğiniz miktarı en az sayıda satır içeren bir tablo varsa

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

aşağıdaki çalışacaktır. Bu, her bir diziyi size uymayan aynı miktarda artırır, ancak PL/SQL veya dizinin düşürülmesi/yeniden oluşturulması gerekmeden hızlı ve kolaydır. Üretimin öncesinde geliştirme sunucu sıraları almak istediğimde her zaman kullanırım.

SELECT seq1.nextval, seq2.nextval, ..., seqN.nextval 
    FROM very_large_table 
WHERE ROWNUM <= number_of_rows_to_add