ORA-22835: vyrovnávacia pamäť je príliš malá a ORA-25137: Údaje hodnota mimo rozsahu

0

Otázka

Sme pomocou softvéru, ktorý má obmedzenú Vešteckých schopností. Potrebujem filter prostredníctvom CLOB pole uistiť sa, že to má určitú hodnotu. Za normálnych okolností, mimo tohto softvéru by som urobiť niečo ako:

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

Avšak, toto nie je podporované, takže som pokuse o použitie CAST namiesto toho. Snažil som sa veľa rôznych pokusov, ale tak ďaleko to, čo som našiel:

Softvér má zabudovanú dotaz checker/validator a to sú tie, ukazuje, ako neplatné:

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

Avšak, validator sa prijať tieto:

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

Bohužiaľ, aj keď validator umožňuje tieto nich prejsť, keď je spustený dotaz na načítanie údajov, mám ORA-22835: Buffer too small pri používaní VARCHAR alebo NVARCHAR. A ja si ORA-25137: Data value out of range pri používaní CHAR.

Existujú aj iné spôsoby, ako by som mohol pokúsiť zistiť, že moje CLOB pole má určitú hodnotu, keď filtrovanie údajov? Ak nie, ako sa môžem aktuálne otázky?

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

Najlepšiu odpoveď

1

Chyba, že ste stále naznačuje, že Oracle sa snaží uplatňovať CAST(t.new_value AS VARCHAR(10)) na riadok, kde new_value má viac než 10 znakov. To dáva zmysel vzhľadom na vaše popis, ktorý new_value je všeobecný audit pole, ktoré má hodnoty z veľkého počtu rôznych tabuliek s rôznymi údaje dĺžky. Vzhľadom na to, že budete potrebovať, aby sa štruktúra dopytu tak, aby sily nástroj na zníženie nastaviť riadkov sa uchádzate o cast na dole len tie, kde new_value má len jeden znak pred uplatnením cast.

Nevedia, aký rozsah softvér používate poskytuje na štruktúrovanie kódu, nie som si istý, aké možnosti máte tam. Uvedomte si, že v závislosti na tom, ako robustný potrebujete to, optimalizáciu má dosť flexibilitu rozhodnú predikáty a funkcie na projekciu v ľubovoľnej objednávke. Takže aj keď si nájsť prístup, ktorý pracuje raz, môže prestať fungovať v budúcnosti, keď štatistiky zmeniť alebo databáza je inovovaný a Oracle rozhodne, ak chcete vybrať iný plán.

2021-11-24 16:59:52
0

Použitie ako vzorové údaje

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

Musíte použiť dbms_lob.substr(col,1) ak chcete získať prvý znak (od predvoleného offset= 1)

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

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

Všimnite si, že predvolený amount (= dĺžka) z substring je 32767 takže použiť iba DBMS_LOB.SUBSTR(COL) vráti viac ako sa očakáva.

CAST pre CLOB robí nie rez reťazec, liatinová dĺžku, ale (tak, ako vám uvádza) sa vracia výnimkou ORA-25137: Data value out of range ak pôvodný reťazec je longert, že liatinová dĺžky.

Tak, ako je zdokumentované na CAST vyhlásenie

CAST nepodporuje priamo akýchkoľvek LOB dátové typy. Pri použití ODOVZDANÝCH previesť CLOB hodnoty do znak typ údajov alebo BLOB hodnoty do RAW data typ databázy implicitne prevádza LOB hodnotu znaku alebo surové dáta a potom výslovne vrhá výsledná hodnota do cieľového typ údajov. Ak je výsledná hodnota je väčšia ako typ cieľa, potom databázy vráti chybu.

2021-11-23 17:06:33

Bohužiaľ, aj po pridaní offset, dotaz validator nerozpozná DBMS_LOB.SUBSTR() tak som sa nemôže použiť. Myslel som si, CAST je schopný znížiť reťazec, lebo sme sa tiež mali používať riešenie pre TRUNC: CAST(CAST(date_field AS VARCHAR(9)) AS DATE) a funguje to. To zbaví čase časť. Dúfal som, že by sme mohli robiť niečo podobné pre tento jeden.
Patrick Gregorio

Áno, to funguje VARCHAR ale žiaľ, nie pre CLOB Aktualizoval som odpoveď. @PatrickGregorio
Marmite Bomber

V iných jazykoch

Táto stránka je v iných jazykoch

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