ORA-22835: Arabellek çok küçük ve ORA-25137: Veri değeri aralık dışı

0

Soru

Sınırlı Oracle yeteneklerine sahip bir yazılım kullanıyoruz. Belirli bir değere sahip olduğundan emin olarak bir CLOB alanını filtrelemem gerekiyor. Normalde, bu yazılımın dışında şöyle bir şey yapardım:

DBMS_LOB.SUBSTR(t.new_value) = 'Y'

Ancak, bu desteklenmiyor, bu yüzden kullanmaya çalışıyorum CAST yerine. Birçok farklı denemeyi denedim ama şimdiye kadar bulduğum şey bunlar:

Yazılımın yerleşik bir sorgu denetleyicisi / doğrulayıcısı vardır ve bunlar geçersiz olarak gösterilenlerdir:

DBMS_LOB.SUBSTR(t.new_value)
CAST(t.new_value AS VARCHAR2(10))
CAST(t.new_value AS NVARCHAR2(10))

Ancak, doğrulayıcı bunları kabul eder:

CAST(t.new_value AS VARCHAR(10))
CAST(t.new_value AS NVARCHAR(10))
CAST(t.new_value AS CHAR(10))

Ne yazık ki, doğrulayıcı bunların geçmesine izin verse de, veri almak için sorguyu çalıştırırken şunu alıyorum ORA-22835: Buffer too small kullanırken VARCHAR veya NVARCHAR. Ve anladım ORA-25137: Data value out of range kullanırken CHAR.

Verileri filtrelerken CLOB alanımın belirli bir değere sahip olup olmadığını kontrol etmenin başka yolları var mı? Değilse, güncel sorunlarımı nasıl düzeltebilirim?

database oracle
2021-11-23 16:17:40
2

En iyi cevabı

1

Aldığınız hata, Oracle'ın uygulamaya çalıştığını gösterir. CAST(t.new_value AS VARCHAR(10)) bir satıra nerede new_value 10'dan fazla karaktere sahiptir. Açıklamana göre bu mantıklı. new_value çeşitli veri uzunluklarına sahip çok sayıda farklı tablodaki değerlere sahip genel bir denetim alanıdır. Verilen iyileştirici satır kümesi azaltmak için zorlar bir şekilde sorgu yapısı lazım başvuracağınız cast sadece bu yerlere inmek için new_value uygulamadan önce sadece tek bir karaktere sahiptir cast.

Kullandığınız yazılımın kodunuzu yapılandırmak için ne tür bir kapsam sağladığını bilmeden, orada hangi seçeneklere sahip olduğunuzdan emin değilim. Sağlam, bu ihtiyacı nasıl bağlı olduğunu unutmayın, iyileştirici rasgele bir sırayla projeksiyon hakkında, fiilleri ve işlevleri uygulamak için seçmek için esneklik biraz var. Bu nedenle, bir kez işe yarayan bir yaklaşım bulsanız bile, istatistikler değiştiğinde veya veritabanı yükseltildiğinde ve Oracle farklı bir plan seçmeye karar verdiğinde gelecekte çalışmayı durdurabilir.

2021-11-24 16:59:52
0

Bunu örnek veri olarak kullanma

create table tab1(col clob);
insert into tab1(col) values (rpad('x',3000,'y'));

Kullanmanız gerekir dbms_lob.substr(col,1) ilk karakteri almak için (varsayılandan offset= 1)

select dbms_lob.substr(col,1) from tab1;

DBMS_LOB.SUBSTR(COL,1)
----------------------
x

Varsayılan olduğunu unutmayın amount alt dizenin (=uzunluğu) 32767 yani sadece kullanarak DBMS_LOB.SUBSTR(COL) beklediğinizden daha fazla geri dönecek.

CAST için CLOB dizeyi döküm uzunluğuna kesmez, ancak (gözlemlediğiniz gibi) istisnayı döndürür ORA-25137: Data value out of range orijinal dize, döküm uzunluğundan daha uzunsa.

İçin belgelendiği gibiCAST açıklama

CAST, LOB veri türlerinden hiçbirini doğrudan desteklemez. Bir CLOB değerini bir karakter veri türüne veya bir BLOB değerini HAM veri türüne dönüştürmek için CAST kullandığınızda, veritabanı LOB değerini örtük olarak karaktere veya ham verilere dönüştürür ve sonuçta elde edilen değeri açıkça hedef veri türüne atar. Elde edilen değer hedef türden büyükse, veritabanı bir hata döndürür.

2021-11-23 17:06:33

Ne yazık ki ofseti ekledikten sonra bile sorgu doğrulayıcısı tanımıyor DBMS_LOB.SUBSTR() yani bunu kullanamam. Sandım ki CAST dizeyi kesebilir, çünkü bunun için de bir geçici çözüm kullanmak zorunda kaldık TRUNC: CAST(CAST(date_field AS VARCHAR(9)) AS DATE) ve işe yarıyor. Zaman kısmından kurtulur. Bunun için benzer bir şey yapabileceğimizi umuyordum.
Patrick Gregorio

Evet bu işe yarıyor VARCHAR ama maalesef değil CLOB Cevabı güncelledim. @ PatrickGregorio
Marmite Bomber

Diğer dillerde

Bu sayfa diğer dillerde

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................