Apakah ada instruksi SQL untuk mengambil nilai urutan yang tidak menambahnya.
Terima kasih.
EDIT DAN KESIMPULAN
Seperti yang dikatakan oleh Justin Cave Tidak berguna untuk mencoba "menyimpan" nomor urut begitu
select a_seq.nextval from dual;
cukup baik untuk memeriksa nilai urutan.
Saya masih menyimpan jawaban Ollie sebagai jawaban yang baik karena menjawab pertanyaan awal. tetapi tanyakan pada diri Anda tentang perlunya tidak mengubah urutan jika Anda pernah ingin melakukannya.
nextval
urutan untuk menguji itu? Anda tidak berasumsi bahwa urutannya akan bebas celah, bukan? Jadi "membuang-buang" nilai urutan seharusnya tidak menjadi masalah.Jawaban:
Anda bisa mendapatkan berbagai metadata urutan dari
user_sequences
,all_sequences
dandba_sequences
.Pandangan ini bekerja lintas sesi.
EDIT:
Jika urutannya dalam skema default Anda, maka:
Jika Anda menginginkan semua metadata, maka:
Semoga ini bisa membantu ...
EDIT2:
Cara bertele-tele untuk melakukannya dengan lebih andal jika ukuran cache Anda bukan 1 adalah:
Berhati-hatilah bahwa jika orang lain menggunakan urutan selama ini - mereka (atau Anda) mungkin mendapatkannya
Juga, Anda mungkin ingin mengatur cache
NOCACHE
sebelum reset dan kemudian kembali ke nilai aslinya setelah itu untuk memastikan Anda tidak menembolok banyak nilai.sumber
ALL_SEQUENCES
adalah pandangan. Jika Anda tidak memiliki akses ke sana, cobalah memilih dariUSER_SEQUENCES
apakah urutannya ada di skema default Anda. (Anda tidak perlusequence_owner = '<sequence_owner>'
klausa untukUSER_SEQUENCES
).LAST_NUMBER
dalamALL_SEQUENCES
tidak akan menjadi nomor terakhir yang sesi benar-benar diberi dan tidak akan menjadi nomor yang akan kembali dari panggilan kesequence_name.nextval
pada umumnya. Dengan asumsi Anda telah menetapkan urutan keCACHE
lebih dari 1 (default adalah 20),LAST_NUMBER
akan menjadi nomor terakhir yang ada di cache. Tidak ada jaminan bahwa nomor ini akan benar-benar diberikan pada sesi apa pun.ALTER SEQUENCE seq INCREMENT BY -1;
akan menjadi masalah kecuali seseorang dapat menjamin bahwa tidak ada sesi lain akan meneleponseq.nextval
. Kalau tidak, urutannya akan membagikan nilai duplikat, yang biasanya bukan yang diinginkan.select MY_SEQ_NAME.currval from DUAL;
Perlu diingat bahwa ini hanya berfungsi jika Anda berlari
select MY_SEQ_NAME.nextval from DUAL;
di sesi saat ini.sumber
Jawaban asli saya secara faktual salah dan saya senang itu dihapus. Kode di bawah ini akan berfungsi dalam kondisi berikut a) Anda tahu bahwa tidak ada orang lain yang mengubah urutan b) urutan diubah oleh sesi Anda. Dalam kasus saya, saya mengalami masalah serupa di mana saya memanggil prosedur yang mengubah nilai dan saya yakin anggapan itu benar.
Sayangnya, jika Anda tidak mengubah urutan dalam sesi Anda, saya percaya orang lain benar dalam menyatakan bahwa NEXTVAL adalah satu-satunya cara untuk pergi.
sumber
Ini bukan jawaban, sungguh dan saya akan memasukkannya sebagai komentar seandainya pertanyaannya tidak dikunci. Ini menjawab pertanyaan:
Mengapa Anda menginginkannya?
Asumsikan Anda memiliki tabel dengan urutan sebagai kunci utama dan urutan dihasilkan oleh pemicu sisipan. Jika Anda ingin agar urutan tersedia untuk pembaruan berikutnya ke catatan, Anda harus memiliki cara untuk mengekstrak nilai itu.
Untuk memastikan Anda mendapatkan yang benar, Anda mungkin ingin membungkus permintaan INSERT dan RonK dalam transaksi.
Pertanyaan RonK:
Dalam skenario di atas, peringatan RonK tidak berlaku karena penyisipan dan pembaruan akan terjadi di sesi yang sama.
sumber
Saya juga mencoba menggunakan CURRVAL, dalam kasus saya untuk mengetahui apakah beberapa proses memasukkan baris baru ke beberapa tabel dengan urutan itu sebagai Primary Key. Asumsi saya adalah bahwa CURRVAL akan menjadi metode tercepat. Tapi a) CurrVal tidak berfungsi, itu hanya akan mendapatkan nilai lama karena Anda berada di sesi Oracle lain, sampai Anda melakukan NEXTVAL di sesi Anda sendiri. Dan b) a
select max(PK) from TheTable
juga sangat cepat, mungkin karena PK selalu diindeks. Atauselect count(*) from TheTable
. Saya masih bereksperimen, tetapi kedua SELECT sepertinya cepat.Saya tidak keberatan ada celah secara berurutan, tetapi dalam kasus saya, saya berpikir untuk melakukan jajak pendapat, dan saya akan membenci gagasan kesenjangan yang sangat besar. Terutama jika SELECT sederhana akan sama cepatnya.
Kesimpulan:
sumber