it-swarm.asia

Bagaimana cara mengambil nilai saat ini dari urutan Oracle tanpa menambahkannya?

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 ingin melakukannya.

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

Anda bisa mendapatkan berbagai metadata urutan dari user_sequences, all_sequences dan dba_sequences.

Pandangan ini bekerja lintas sesi.

EDIT:

Jika urutannya dalam skema default Anda, maka:

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

Jika Anda menginginkan semua metadata, maka:

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

Semoga ini bisa membantu ...

EDIT2:

Cara bertele-tele untuk melakukannya dengan lebih andal jika ukuran cache Anda bukan 1 adalah:

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.

Berhati-hatilah bahwa jika orang lain menggunakan urutan selama ini - mereka (atau Anda) mungkin mendapatkannya

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

Selain itu, Anda mungkin ingin mengatur cache ke NOCACHE sebelum pengaturan ulang dan kemudian kembali ke nilai aslinya setelah itu untuk memastikan Anda tidak menembolok banyak nilai.

152
Ollie

select MY_SEQ_NAME.currval from DUAL;

Perlu diingat bahwa ini hanya berfungsi jika Anda menjalankan select MY_SEQ_NAME.nextval from DUAL; di sesi saat ini.

114
RonK

Balasan 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.

SELECT mysequence.CURRVAL INTO v_myvariable FROM DUAL;

Sayangnya, jika Anda tidak mengubah urutan dalam sesi Anda, saya yakin orang lain benar dalam menyatakan bahwa NEXTVAL adalah satu-satunya cara untuk pergi.

0
georgejo

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:

select MY_SEQ_NAME.currval from DUAL;

Dalam skenario di atas, peringatan RonK tidak berlaku karena penyisipan dan pembaruan akan terjadi di sesi yang sama.

0
Ainsworth