ORA-22835: Búfer es demasiado pequeño y ORA-25137: valor de los Datos fuera de rango

0

Pregunta

Estamos utilizando un software que ha limitado Oracle capacidades. Necesito filtrar a través de un campo CLOB por asegurarse de que tiene un valor específico. Normalmente, fuera de este software me gustaría hacer algo como:

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

Sin embargo, esto no es apoyado, así que estoy tratando de usar CAST en su lugar. He probado muchos intentos diferentes, pero hasta el momento estos son los que he encontrado:

El software tiene un built-in de consulta corrector/validador y estos son los que se muestra como no válido:

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

Sin embargo, el validador no acepta estos:

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

Desafortunadamente, aunque el validador permite que estos van a través de, cuando se ejecuta la consulta para obtener los datos, me sale ORA-22835: Buffer too small cuando se utiliza VARCHAR o NVARCHAR. Y me da ORA-25137: Data value out of range cuando se utiliza CHAR.

Hay otras maneras en las que podría tratar de comprobar que mi CLOB campo tiene un valor específico a la hora de filtrar los datos? Si no, ¿cómo puedo solucionar mis problemas actuales?

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

Mejor respuesta

1

El error que estás recibiendo indica que Oracle está tratando de aplicar el CAST(t.new_value AS VARCHAR(10)) a una fila donde new_value tiene más de 10 caracteres. Que tiene sentido dado que su descripción new_value es un genérico de auditoría de campo que tiene los valores de un gran número de tablas diferentes con una variedad de longitudes de datos. Dado que, sería necesario que la estructura de la consulta de una manera que obliga a que el optimizador de reducir el conjunto de filas que se está aplicando la cast a sólo aquellos donde new_value contiene un solo carácter, antes de la aplicación de la cast.

No sabiendo qué tipo de alcance que el software que usted está usando proporciona para estructurar el código, no estoy seguro de qué opciones tienes. Ser consciente de que dependiendo de cómo robusto usted necesita esto, el optimizador tiene un poco de flexibilidad para elegir la aplicación de los predicados y funciones en la proyección en un orden arbitrario. Así que incluso si usted encontrar un método que funciona una vez, puede dejar de trabajar en el futuro, cuando las estadísticas de cambio o la base de datos se actualiza y Oracle decide elegir un plan diferente.

2021-11-24 16:59:52
0

El uso de este como de los datos de muestra

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

Usted necesidad de utilizar dbms_lob.substr(col,1) para obtener el primer carácter (desde el valor predeterminado offset= 1)

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

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

Tenga en cuenta que el valor predeterminado amount (= longitud) de la subcadena es 32767 así que, usando sólo DBMS_LOB.SUBSTR(COL) devolverá más de lo que usted espera.

CAST para CLOB ¿ no cortar la cadena a la fundidas de longitud, pero (como se observa) devuelve la excepción ORA-25137: Data value out of range si la cadena original es longert que la escayola de longitud.

Como se ha documentado para el CAST declaración de

YESO no es directamente compatible con cualquiera de los tipos de datos LOB. Cuando se utiliza CAST para convertir un CLOB valor en un tipo de datos de caracteres o un valor BLOB en el tipo de datos RAW, la base de datos se convierte implícitamente la unidad de negocio de valor a los caracteres o datos en bruto y, a continuación, de forma explícita arroja el valor resultante en el tipo de datos de destino. Si el valor resultante es mayor que el tipo de destino, a continuación, la base de datos devuelve un error.

2021-11-23 17:06:33

Por desgracia, incluso después de añadir el desplazamiento, la consulta validador no reconoce DBMS_LOB.SUBSTR() así que no puedo usar eso. Pensé CAST es capaz de cortar la cadena ya que también tuvimos que utilizar una solución para TRUNC: CAST(CAST(date_field AS VARCHAR(9)) AS DATE) y funciona. Se deshace de la porción de tiempo. Tenía la esperanza de que podríamos hacer algo similar para este.
Patrick Gregorio

Sí, esto funciona para VARCHAR pero por desgracia no para CLOB He actualizado la respuesta. @PatrickGregorio
Marmite Bomber

En otros idiomas

Esta página está en otros idiomas

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