oracle - descargar - ORA-01461: puede enlazar un valor LONG solo para insertarse en una columna LONG-Se produce al consultar
oracle xe 18c (14)
Agregando otro caso de uso donde encontré esto sucediendo. Estaba usando una aplicación ADF Fusion y el tipo de columna que se usaba era un varchar2 (4000) que no podía acomodar el texto y, por lo tanto, este error.
Cuando trato de consultar objetos, termino con el siguiente error:
ORA-01461: can bind a LONG value only for insert into a LONG column
¿Podría alguien ayudarme en la causa y la solución del problema?
Bien, bien, ya que no mostró ningún código, haré algunas suposiciones aquí.
Según el error ORA-1461, parece que ha especificado un tipo de datos LONG en una instrucción select? ¿Y estás tratando de vincularlo a una variable de salida? ¿Está bien? El error es bastante directo. Solo puede enlazar un valor LONG para insertarlo en la columna LONG.
No estoy seguro de qué más decir. El error es bastante autoexplicativo.
En general, es una buena idea alejarse del tipo de datos LONG a un CLOB. Los CLOB son mucho más compatibles y los tipos de datos LONG realmente solo están ahí para compatibilidad con versiones anteriores.
Aquí hay una lista de restricciones de tipo de datos LARGO
Espero que ayude.
En mi caso particular, estaba tratando de almacenar un archivo codificado en Base64 en un campo BLOB de tabla, usando Mybatis.
Entonces en mi xml tuve:
<insert id="save..." parameterType="...DTO">
<selectKey keyProperty="id" resultType="long" order="BEFORE">
SELECT SEQ.nextVal FROM DUAL
</selectKey>
insert into MYTABLE(
ID,
...,
PDF
) values (
#{id, jdbcType=VARCHAR},
...,
#{tcPdf, jdbcType=BLOB},
)
</insert>
y en mi DTO:
String getPdf(){
return pdf;
}
Eso hace a Mybatis amenaza como si fuera una secuencia Char de cadena e intenta almacenarla como Varchar. Entonces mi solución fue la siguiente:
En mi DTO:
Byte[] getPdf(){
return pdf.getBytes();
}
Y funcionó.
Espero que esto pueda ayudar a cualquiera.
Encontré el mismo problema al usar Siebel REXPIMP (importación de registro) cuando uso el último controlador de Instant Client. Para solucionar los problemas, utilice en su lugar el controlador Data Direct proporcionado por Siebel. La DLL es SEOR823.DLL
Encontré este mensaje de error al intentar insertar String en una columna XMLTYPE.
Específicamente utilizando PreparedStatement de Java de esta manera:
ps.setString(''XML'', document);
donde XML
aquí se define como XMLTYPE.
Estaba enfrentando el mismo problema y lo VARCHAR
simplemente reemplazando VARCHAR
con CLOB
. Este link me ayudó.
Este error ocurre cuando uno intenta usar una variable varchar de más de 4000 bytes en una declaración de SQL. PL / SQL permite varchars hasta 32767 bytes, pero el límite para las tablas de la base de datos y el lenguaje SQL es 4000. No se pueden usar las variables PL / SQL que SQL no reconoce en las sentencias SQL; una excepción, como explica el mensaje, es una inserción directa en una columna de tipo largo.
create table test (v varchar2(10), c clob);
declare
shortStr varchar2(10) := ''0123456789'';
longStr1 varchar2(10000) := shortStr;
longStr2 varchar2(10000);
begin
for i in 1 .. 10000
loop
longStr2 := longStr2 || ''X'';
end loop;
-- The following results in ORA-01461
insert into test(v, c) values(longStr2, longStr2);
-- This is OK; the actual length matters, not the declared one
insert into test(v, c) values(longStr1, longStr1);
-- This works, too (a direct insert into a clob column)
insert into test(v, c) values(shortStr, longStr2);
-- ORA-01461 again: You can''t use longStr2 in an SQL function!
insert into test(v, c) values(shortStr, substr(longStr2, 1, 4000));
end;
La respuesta de Kiran es definitivamente la respuesta para mi caso.
En la parte del código, dividí la cadena en 4000 cadenas de caracteres e intenté ponerlas en db.
Explota con este error
La causa del error es usar caracteres utf, esos conteos de 2 bytes cada uno. Incluso trunco a 4000 caracteres en el código (similar a String.Take (4000)), Oracle considera 4001 cuando string contiene ''ö'' o cualquier otro no-eng (no ascii para ser precisos, que se representan con dos o bytes en utf8) caracteres.
Las aplicaciones que utilizan JDBC 10.1 tienen un error (ID de documento 370438.1) y pueden arrojar la misma excepción ORA-01461 al trabajar con la base de datos del juego de caracteres UTF8 aunque los caracteres insertados sean menores que el tamaño máximo de la columna.
Solución recomendada: - Use controladores 10gR2 JDBC o superiores en tal caso.
HTH
Primero tuve el mismo problema con la base de datos de Entity Framework en todas las columnas de CLOB.
Como solución alternativa, rellené los valores de texto con espacios para que tuvieran al menos 4000 de ancho en las operaciones de inserción (no incluía ninguna solución mejor).
También puede suceder con columnas varchar2. Esto es bastante reproducible con PreparedStatements a través de JDBC simplemente
- creando una tabla con una columna de varchar2 (20 o cualquier longitud arbitraria) y
- insertando en la tabla de arriba con una fila que contiene más de 20 caracteres
Entonces, como se dijo anteriormente, puede ser incorrecto con los tipos, o se excedió el ancho de la columna.
También tenga en cuenta que como varchar2 permite 4k caracteres máximos, el límite real será 2k para caracteres de doble byte
Espero que esto ayude
Tengo una solución para Java / JPA / eclipselink / oracle cuando inserto una cadena xml larga (> 4000) en una columna XMLTYPE en Insert XML con más de 4000 caracteres en una columna Oracle XMLTYPE . Para mayor claridad, incluya los mismos contenidos aquí en caso de que el enlace no funcione
Primero debe convertir una cadena de xml para más de 4000 caracteres en tipo SQLXML.
Entorno: jpa 2.1.0, eclipselink 2.5.2, oráculo db 11gr2
SQL:
CREATE TABLE "XMLTEST"
( "ID" NUMBER(10,0) NOT NULL ENABLE,
"DESCRIPTION" VARCHAR2(50 CHAR) NOT NULL ENABLE,
"XML_TXT" "XMLTYPE" NOT NULL ENABLE
);
INSERT INTO XMLTEST (ID, DESCRIPTION, XML_TXT) VALUES (101, ''XML DATA'', ''<data>TEST</data>'');
COMMIT;
DROP TABLE "XMLTEST";
Código Java
String sql = "INSERT INTO XMLTEST (ID, DESCRIPTION, XML_TXT) VALUES (?, ?, ?)";
String xmlDataStr = "<data>test...</data>"; // a long xml string with length > 4000 characters
Connection con = getEntityManager().unwrap(Connection.class);
SQLXML sqlXml = con.createSQLXML();
sqlXml.setString(xmlDataStr);
Código Java: use PreparedStatement
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setLong(1, 201);
pstmt.setLong(2, "Long XML Data");
pstmt.setSQLXML(3, sqlXml);
pstmt.execute();
Código de Java: use una consulta nativa en lugar de PreparedStatement
Query query = getEntityManager().createNativeQuery(sql);
query.setParameter(1, 301);
query.setParameter(2, "Long XML Data");
query.setParameter(3, sqlXml);
query.executeUpdate();
Tuve el mismo problema al utilizar PHP y las declaraciones preparadas en una columna VARCHAR2. Mi cadena no excedió el tamaño VARCHAR2. El problema fue que utilicé -1 como maxlength para el enlace, pero el contenido de la variable cambió más tarde.
Por ejemplo:
$sMyVariable = '''';
$rParsedQuery = oci_parse($rLink, ''INSERT INTO MyTable (MyVarChar2Column) VALUES (:MYPLACEHOLDER)'');
oci_bind_by_name($rParsedQuery, '':MYPLACEHOLDER'', $sMyVariable, -1, SQLT_CHR);
$sMyVariable = ''a'';
oci_execute($rParsedQuery, OCI_DEFAULT);
$sMyVariable = ''b'';
oci_execute($rParsedQuery, OCI_DEFAULT);
Si reemplaza el -1 con el ancho máximo de la columna (es decir, 254), entonces este código funciona. Con -1 oci_bind_by_param utiliza la longitud actual del contenido variable (en mi caso 0) como longitud máxima para esta columna. Esto resulta en ORA-01461 cuando se ejecuta.
Un colega mío y descubrí lo siguiente:
Cuando utilizamos el controlador Microsoft .NET Oracle para conectarnos a una base de datos Oracle (System.Data.OracleClient.OracleConnection)
Y estamos tratando de insertar una cadena con una longitud entre 2000 y 4000 caracteres en un campo CLOB o NCLOB usando un parámetro de base de datos
oraCommand.CommandText = "INSERT INTO MY_TABLE (NCLOB_COLUMN) VALUES (:PARAMETER1)";
// Add string-parameters with different lengths
// oraCommand.Parameters.Add("PARAMETER1", new string('' '', 1900)); // ok
oraCommand.Parameters.Add("PARAMETER1", new string('' '', 2500)); // Exception
//oraCommand.Parameters.Add("PARAMETER1", new string('' '', 4100)); // ok
oraCommand.ExecuteNonQuery();
- cualquier cadena con una longitud inferior a 2000 caracteres no lanzará esta excepción
- cualquier cadena con una longitud de más de 4000 caracteres no lanzará esta excepción
- solo cadenas con una longitud entre 2000 y 4000 caracteres arrojarán esta excepción
Abrimos un boleto en Microsoft para este error hace muchos años, pero todavía no se ha solucionado.