ORA-22835: Tampon trop petit et ORA-25137: Données de la valeur hors de la plage

0

La question

Nous utilisons un logiciel qui a limité Oracle capacités. J'ai besoin de filtrer à travers un CLOB domaine en s'assurant qu'il a une valeur spécifique. Normalement, en dehors de ce logiciel, je voudrais faire quelque chose comme:

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

Cependant, ce n'est pas pris en charge donc je suis d'essayer d'utiliser CAST au lieu de cela. J'ai essayé beaucoup de différentes tentatives, mais jusqu'à présent, ils sont ce que j'ai trouvé:

Le logiciel dispose d'une requête intégrée vérificateur/validator et ce sont celles qu'il indique comme étant non valide:

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

Cependant, le validateur n'accepter les présentes:

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

Malheureusement, même si le validateur permet à ceux-ci d'aller à travers, lors de l'exécution de la requête pour récupérer les données, j'obtiens ORA-22835: Buffer too small lors de l'utilisation de VARCHAR ou NVARCHAR. Et je reçois ORA-25137: Data value out of range lors de l'utilisation de CHAR.

Il existe d'autres moyens que je pourrais essayer pour vérifier que mon CLOB champ a une valeur spécifique lors de filtrage des données? Si non, comment puis-je résoudre mes problèmes?

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

La meilleure réponse

1

L'erreur que vous obtenez indique que Oracle est en train d'essayer d'appliquer les CAST(t.new_value AS VARCHAR(10)) à une ligne où new_value a plus de 10 caractères. Qui a du sens, compte tenu de votre description new_value est un générique de vérification de terrain qui a des valeurs à partir d'un grand nombre de différentes tables avec une variété de données de longueurs. Étant donné que, vous auriez besoin de la structure de la requête d'une manière que les forces de l'optimiseur afin de réduire l'ensemble de lignes que vous êtes en application de la cast pour la réduire à ceux où new_value a un seul personnage avant l'application de l' cast.

Ne sachant pas quelle sorte de champ d'application les logiciels que vous utilisez prévoit de structurer votre code, je ne sais pas quelles sont les options que vous avez là. Être conscient que selon la façon robuste vous avez besoin de cela, l'optimiseur a un peu de flexibilité pour choisir d'appliquer des prédicats et fonctions de la projection dans un ordre arbitraire. Donc, même si vous trouvez une approche qui fonctionne une fois, il peut cesser de fonctionner dans l'avenir, lorsque les statistiques du changement ou de la base de données est mis à jour et Oracle décide de choisir un autre régime.

2021-11-24 16:59:52
0

L'utilisation de ce que les données de l'échantillon

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

Vous avez besoin d'utiliser dbms_lob.substr(col,1) pour obtenir le premier caractère (à partir de la valeur par défaut offset= 1)

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

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

Notez que la valeur par défaut amount (= longueur) de la sous-chaîne est 32767 donc, en utilisant seulement DBMS_LOB.SUBSTR(COL) sera de retour plus que vous attend.

CAST pour CLOB ne pas couper la chaîne à la coulée de la longueur, mais (comme vous observe) renvoie l'exception ORA-25137: Data value out of range si la chaîne d'origine est longert que la coulée de la longueur.

Comme l'a documenté la CAST déclaration

CAST ne pas les types de données LOB. Lorsque vous utilisez la fonction CAST pour convertir un CLOB valeur dans un type de données caractère ou une GOUTTE de la valeur dans le type de données RAW, la base de données convertit implicitement la valeur LOB de caractère ou de données brutes et puis explicitement jette la valeur obtenue dans le type de données cible. Si la valeur est plus grande que le type de cible, la base de données renvoie une erreur.

2021-11-23 17:06:33

Malheureusement, même après l'ajout de l'offset, la requête validateur ne reconnaît pas DBMS_LOB.SUBSTR() je ne peux donc pas l'utiliser. J'ai pensé CAST est capable de couper la chaîne parce que nous avons également eu à utiliser une solution de contournement pour TRUNC: CAST(CAST(date_field AS VARCHAR(9)) AS DATE) et il fonctionne. Il se débarrasse de la partie heure. J'espérais que nous pourrions faire quelque chose de similaire pour celui-ci.
Patrick Gregorio

Oui, cela fonctionne pour VARCHAR mais malheureusement pas pour CLOB J'ai mis à jour la réponse. @PatrickGregorio
Marmite Bomber

Dans d'autres langues

Cette page est dans d'autres langues

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