ORA-22835: Tampon prea mici și ORA-25137: Date de valoare în afara intervalului

0

Problema

Suntem folosind un software care a limitat Oracle capacități. Trebuie să se filtrează printr-un CLOB domeniu de către asigurându-vă că are o anumită valoare. În mod normal, în afara de acest software nu ar face ceva de genul:

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

Cu toate acestea, acest lucru nu este acceptată așa că eu sunt încercarea de a utiliza CAST în schimb. Am încercat mai multe încercări diferite, dar până în prezent acestea sunt ceea ce am găsit:

Software-ul are un built-in de interogare checker/validator și acestea sunt cele care se prezinta ca invalid:

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

Cu toate acestea, validatorul nu accepta aceste:

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

Din păcate, chiar dacă validator vă permite acestea trece prin, atunci când rulează interogarea pentru a prelua date, am ORA-22835: Buffer too small atunci când se utilizează VARCHAR sau NVARCHAR. Și am ORA-25137: Data value out of range atunci când se utilizează CHAR.

Există alte modalități prin care aș putea încerca să verificați meu CLOB câmp are o anumită valoare atunci când filtrarea datelor? Dacă nu, cum fac sa-mi repar probleme actuale?

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

Cel mai bun răspuns

1

Eroarea vei primi indică faptul că Oracle este încercarea de a aplica CAST(t.new_value AS VARCHAR(10)) la un rând, în cazul în care new_value are mai mult de 10 caractere. Asta are sens având în vedere descrierea pe care new_value este un generic de audit câmp care are valori de la un număr mare de mese diferite, cu o varietate de date de lungimi. Având în vedere că, ai nevoie pentru a structura de interogare într-un mod care forțele de optimizare pentru a reduce set de rânduri esti aplicarea cast la doar cei care new_value are doar un singur caracter înainte de a aplica cast.

Nu știu ce fel de aplicare de software utilizați prevede structurarea cod, nu sunt sigur ce optiuni ai acolo. Fi conștienți de faptul că, în funcție de cât de robust ai nevoie de acest lucru, de optimizare are destul de un pic de flexibilitate, pentru a alege să aplice predicate și funcțiile pe proiecția într-o ordine arbitrară. Deci, chiar dacă ai găsi o abordare care funcționează o dată, se poate opri de lucru în viitor, atunci când statisticile schimba sau baza de date este actualizat și Oracle decide să aleagă un alt plan.

2021-11-24 16:59:52
0

Folosind acest fel de date eșantion

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

Aveți nevoie pentru a utiliza dbms_lob.substr(col,1) pentru a obține primul caracter (de la implicit offset= 1)

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

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

Rețineți că în mod implicit amount (= lungimea) de subșirul este 32767 deci, folosind doar DBMS_LOB.SUBSTR(COL) va reveni mai mult decât se așteaptă.

CAST pentru CLOB nu nu taie sfoara la turnat lungime, dar (ca tine observă) returnează excepție ORA-25137: Data value out of range dacă șirul inițial este longert că turnate lungime.

Ca și documentate pentru CAST declarație

EXPRIMATE nu are suport direct orice LOB tipuri de date. Atunci când utilizați EXPRIMATE pentru a converti un CLOB valoare într-un personaj tip de date sau o PATA de valoare în PRIME tip de date, baza de date, implicit, îl convertește LOB valoare caracterul sau datele primare și apoi, în mod explicit, mulaje valoarea rezultată în țintă tip de date. Dacă valoarea rezultată este mai mare decât ținta tip, atunci baza de date returnează o eroare.

2021-11-23 17:06:33

Din păcate, chiar și după adăugarea offset, interogarea validator nu recunoaște DBMS_LOB.SUBSTR() deci nu-l pot folosi. M-am gândit CAST este capabil să taie sfoara pentru că am avut, de asemenea, să utilizați o soluție pentru TRUNC: CAST(CAST(date_field AS VARCHAR(9)) AS DATE) și funcționează. Acesta scapa de porțiunea de timp. Speram sa putem face ceva similar pentru asta.
Patrick Gregorio

Da, acest lucru funcționează pentru VARCHAR dar din pacate nu pentru CLOB Am actualizat răspunsul. @PatrickGregorio
Marmite Bomber

În alte limbi

Această pagină este în alte limbi

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