Soru Oracle: Bu oturumda MySequence.currval dizisi henüz tanımlanmadı


Bu ne anlama geliyor ve etrafından nasıl geçebilirim?

SELECT MySequence.CURRVAL FROM DUAL;

Sonuç:

ORA-08002: Bu oturumda MySequence.CURRVAL dizisi henüz tanımlanmadı


33
2018-04-30 21:41


Menşei




Cevaplar:


mysequence.CURRVAL, sıralı mysequence öğesinden elde edilen en son değeri döndürür sizin oturum ve bu nedenle mysequence.NEXTVAL kullanarak en az bir kez oturumda bir değer elde edinceye kadar tanımlanmamış. CURRVAL'in amacı, kod değerinizi kodunuzda bir kereden fazla kullanmanıza izin vermektir.

insert into parent (parent_id, ...) values (mysequence.NEXTVAL, ...);

insert into child (parent_id, ...) values (mysequence.CURRVAL, ...);

CURRVAL, sırayla elde edilen son değeri döndürdüyse herhangi oturum, daha sonra yukarıdaki kodda işe yaramaz ve aslında veri bozulmasına yol açabilir!


43
2018-05-01 10:35



Bu bir bahane gibi geliyor. Başka hiçbir seansın diziyi kullanmadığından emin olsaydınız - teoride kuramazsınız, ancak pratik yapabilirsiniz - o zaman herhangi bir oturumda son değerin ne olduğunu öğrenmek istediğinizde son derece yararlı olur - Bu özellikle sık rastlanan bir durum olmasa da, bu cevaba tökezlediğimde, içinde olduğum kişi olacağa benziyor. Sıralama değerini saklamak için bir değişken kullanmaya devam etmek zorunda kalmak sanırım. - user1958756
Bu bir bahaneden daha fazlası! Global olan bir çapak, doğru kalması garanti edilemediği sürece faydasız olacaktır, bu da işlemlerin serileştirilmesini ifade eder, bu da dizilerin temel avantajlarından biri olan ölçeklenebilirlik eksikliğine yol açar. Gerçekten böyle çalışmak için currval istemiyorum! - Tony Andrews
Bu biraz kafa karıştırıcı, çünkü nextvalı garanti edilmiyor mu? Niçin bir sonrakivalık gibi işe yaramaz? - user1958756
Çok kullanıcılı bir sistemde eşzamanlılığı düşünmeniz ve anlamanız gerekir; niçin istediğinizi gerçekçi, hatta özellikle kullanışlı değildir. Şimdi bir "global" currval ve bir milisaniye daha sonra başka bir oturumda nextval alırsanız, şimdi "global" currval hangi kullanımdır? Gereksiniminizi nasıl değiştireceğiniz konusunda ayrı bir soru sormalısınız, çünkü currval değişmeyecek! - Tony Andrews
Tamam. Son eklenen satırın değerini ayrı bir değişkende saklamak için ekstra kod yazmam gerektiğini zaten keşfettim. Sadece soruyorum çünkü garip görünen Oracle, herkesin her zaman HA MU ortamlarında çalıştığı ve bu değerin anlamsız olduğu varsayılacaktır. - user1958756


Oturumunuzda en az bir kez NEXTVAL kullanana kadar CURRVAL kullanamazsınız.


23
2018-04-30 21:44





bunu kullan

select sequence_name, 
   to_char(min_value) min_value,
   to_char(max_value) max_value, 
   increment_by,
   cycle_flag, 
   order_flag, 
   cache_size, 
   to_char(Last_number) last_number
from user_sequences
where sequence_name='MYSEQUENCE'

10
2018-03-04 21:50



Harika! Sadece 'Last_number'i neden char' a çevirdiğini anlamıyorum. - Diego Queiroz


Doug

Asıl soru, seansınızda bir sonraki vade kullanmadığınız zamanlarda neden cürete ihtiyacınız var? USER / ALL / DBA_SEQUENCES görünümünün LAST_NUMBER numaralı sütununa bakabilir, ancak bunu kullanmaya başladığınızda eşzamanlılık sorunlarını düşünebilirsiniz.

Saygılarımızla, Rob.


3
2018-05-01 07:34



Bazı geliştiriciler satır eklerken diziyi kullanmadığından, dizi senkronizasyondan düşmüştü. Mevcut değeri elde etmeye çalışıyordum, böylece ALTER SEQUENCE için doğru artış miktarını belirleyebiliyordum. İlk olarak bir NEXTVAL'e ihtiyacım olduğunu anladığımda, bunun yerine NEXTVAL'i kullandım, aynı zamanda benim amacım da uygun. - Doug


select * from user_sequences     where sequence_name='SEQ_V_WORKORDER_RECNO';

yukarıdaki sorguda SEQ_V_WORKORDER_RECNO benim sıra ismim sizin sıra isminizle değiştirir


2
2018-02-05 06:08