当我尝试查询对象时,出现以下错误:
ORA-01461: can bind a LONG value only for insert into a LONG column
有人可以帮我解决问题的原因和解决方案吗?
Answers:
好的,既然您没有显示任何代码,在这里我将做一些假设。
基于ORA-1461错误,似乎您在select语句中指定了LONG数据类型?您正在尝试将其绑定到输出变量吗?是对的吗?该错误非常简单。您只能绑定一个LONG值以插入到LONG列中。
不知道还有什么要说的。该错误是不言自明的。
通常,从LONG数据类型转移到CLOB是一个好主意。更好地支持CLOB,而LONG数据类型实际上仅是为了向后兼容。
希望能有所帮助。
varchar2列也可能发生这种情况。这可以通过JDBC在PreparedStatements中重现,方法很简单
因此,如上所述,类型可能有误,或者超出了列宽。
另请注意,由于varchar2最多允许4k个字符,因此双字节字符的实际限制为2k
希望这可以帮助
当尝试在SQL语句中使用长度超过4000字节的varchar变量时,会发生此错误。PL / SQL最多允许varchars 32767字节,但数据库表和SQL语言的限制为4000。正如消息所解释的,一个例外是直接插入长型列。
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;
我和我的一个同事发现了以下内容:
当我们使用Microsoft .NET Oracle驱动程序连接到Oracle数据库(System.Data.OracleClient.OracleConnection)
我们正在尝试使用数据库参数将长度在2000到4000个字符之间的字符串插入到CLOB或NCLOB字段中
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();
许多年前,我们在Microsoft针对该错误打开了一张票,但仍未得到修复。
在我的特定情况下,我试图使用Mybatis将Base64编码的文件存储到表BLOB字段中。
所以在我的xml中,我有:
<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>
在我的DTO中:
String getPdf(){
return pdf;
}
这对Mybatis构成了字符串字符序列的威胁,并尝试将其存储为Varchar。所以我的解决方案是:
在我的DTO中:
Byte[] getPdf(){
return pdf.getBytes();
}
和工作。
我希望这可以帮助任何人。
使用最新的Instant Client驱动程序时,我在使用Siebel REXPIMP(注册表导入)时遇到了相同的问题。要解决此问题,请改用Siebel提供的Data Direct驱动程序。DLL是SEOR823.DLL
当在以下位置的XMLTYPE列中插入长xml字符串(> 4000)时,我有一个针对Java / JPA / eclipselink / oracle的解决方案 超过4000个字符的XML插入Oracle XMLTYPE列中插入。为了清楚起见,请在此处添加相同的内容,以防链接不起作用
您首先需要将超过4000个字符的xml字符串转换为SQLXML类型。
环境:jpa 2.1.0,eclipselink 2.5.2,oracle 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";
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);
Java代码-使用PreparedStatement
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setLong(1, 201);
pstmt.setLong(2, "Long XML Data");
pstmt.setSQLXML(3, sqlXml);
pstmt.execute();
Java代码-使用本机查询而不是PreparedStatement
Query query = getEntityManager().createNativeQuery(sql);
query.setParameter(1, 301);
query.setParameter(2, "Long XML Data");
query.setParameter(3, sqlXml);
query.executeUpdate();
使用PHP和在VARCHAR2列上准备语句时,我遇到了同样的问题。我的字符串没有超出VARCHAR2的大小。问题是我使用-1作为最大长度进行绑定,但是变量内容后来更改了。
例如:
$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);
如果用最大列宽(即254)替换-1,则此代码有效。使用-1时,oci_bind_by_param将变量内容的当前长度(在我的情况下为0)用作此列的最大长度。执行时将导致ORA-01461。