我想插入字符长度超过10,000的大尺寸数据.我在每列中使用了CLOB数据类型.我无法插入/更新它在错误后显示的大数据:
ORA-01704: string literal too long
Run Code Online (Sandbox Code Playgroud)
我的代码
insert into table1 value(1,'values>10000');
Run Code Online (Sandbox Code Playgroud) 我有这样的SP
create or replace PROCEDURE myproc
myvar in out mytable.mycol%TYPE
Run Code Online (Sandbox Code Playgroud)
mycol是char的地方(1个字节)
从java代码,我尝试将一个字符串/字符绑定到此变量,我得到
ORA-01461 - 只能将LONG值绑定到LONG列中
如果我替换
myvar in out varchar2
Run Code Online (Sandbox Code Playgroud)
然后它工作
关于如何正确绑定Java代码中的值的任何想法?
我真的想继续使用%type来存储过程输入参数
PS.这不是ORA-01461的重复:只能插入LONG列的LONG值 - 查询时发生,因为它引用了char(1)列
UPDATE
添加更多信息
import java.sql.CallableStatement;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import oracle.jdbc.pool.OracleDataSource;
public class SimpleDbStandalonePureJdbcTest {
public static void main(String[] args) throws SQLException {
OracleDataSource ods = new OracleDataSource();
ods.setUser("xxx");
ods.setPassword("xxx");
ods.setServerName("xxx");
ods.setPortNumber(xxx);
ods.setDriverType("thin");
ods.setNetworkProtocol("tcp");
ods.setDatabaseName("xxx");
Connection conn = ods.getConnection();
CallableStatement sp = conn.prepareCall("{call testleosp(?)} ");
Clob clob …Run Code Online (Sandbox Code Playgroud) 我有一个Oracle Database 10.2.0.4实例.我有基于spring framework 3.0.5,hibernate 3.5.6的java-application.我有一个带有BLOB column(blobContent BLOB)的表和一个带有java.sql.Blob字段的实体(在hibernate XML-mapping中映射为<property name="blobContent" type="blob"/>).我使用Oracle10gDialect.
我得到ORA-01461定期尝试在此表中插入行.我尝试了几个Oracle JDBC驱动程序(10.2.0.4,10.2.0.5和11.2.0.3)但没有任何成功.我的谷歌搜索和搜索metalink数据库的这个问题失败了.我反编译的Oracle JDBC驱动程序,并检查代码起始于法oracle.jdbc.driver.OraclePreparedStatement.setBinaryStream(int, InputStream, long)通oracle.jdbc.driver.DBConversion至oracle.jdbc.driver.OracleConversionInputStream.
一切都看起来不错,只要这段代码可以认为OK :)
请告知如何跟踪此问题...可能在Oracle端(?)...可能正在寻找一些隐式转换...可能是我错过了一些关于此问题的已知Oracle metalink文章?
我们在Oracle中有一个表,其中BLOB列需要填充少量任意字节数据 - 我们永远不会输入超过4000字节的数据.
我正在使用现有的基于C++ OCI的基础结构,这使得在某些上下文中使用绑定变量非常困难,因此我需要仅使用简单查询来填充此BLOB列.(我们正在努力使其现代化,但今天不是一种选择,)
我们对这样的查询运气不错:
UPDATE MyTable
SET blobData = HEXTORAW('0EC1D7FA6B411DA5814...lots of hex data...0EC1D7FA6B411DA5814')
WHERE ID = 123;
Run Code Online (Sandbox Code Playgroud)
起初,这很有效.但是,最近我们遇到了一个需要输入2000多字节数据的情况.此时,我们遇到了Oracle错误,ORA-01704: string literal too long因为传递给的字符串HEXTORAW超过了4000个字符.我尝试拆分字符串然后连接||,但这并没有避免错误.
因此,我需要一种更新此列的方法,并使用简单的查询将其填充超过2000字节的数据.可能吗?
(我知道如果我拥有绑定变量,那将是微不足道的 - 实际上与该表交互的其他应用程序使用这种确切的技术 - 但不幸的是我无法在这里重构数据库内容.只需要将数据输入表格.)
编辑:
一种没有用的有希望的方法是连接RAW:
UTL_RAW.CONCAT(HEXTORAW('...'), HEXTORAW('...'), HEXTORAW('...'))
Run Code Online (Sandbox Code Playgroud)
这避免了字符串长度限制,但似乎Oracle在a的长度上也有一个匹配的内部2000字节限制RAW.所以我不能用一个填充blob RAW.也许有一个函数可以将多个RAWs 连接成一个BLOB.
我使用oracle作为db和流利的Nhibernate进行映射.
下面是我的对象类
public class UserFieldEvent
{
public virtual int Id { get; set; }
public virtual UserFieldBase UserField { get; set; }
public virtual EventType EventType { get; set; }
public virtual string EventScript { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
EventScript的属性长度可以是0到4000.在数据库中,我将EventScript的列类型设置为CLOB.
下面是我的映射类:
public UserFieldEventMap()
{
Table("TBLDS_USERFIELDEVENT");
Id(x => x.Id).GeneratedBy.Sequence("SEQDS_USERFIELDEVENT");
Map(x => x.EventType).CustomType<EventType>();
Map(x => x.EventScript).CustomSqlType("CLOB");
References(x => x.UserField).Column("USERFIELDBASEID");
}
Run Code Online (Sandbox Code Playgroud)
现在,只要EventScript的长度大于2000,我就会收到错误"ORA-01461:只能插入一个LONG值才能插入LONG列." 同时将对象保存到数据库中.任何人都可以帮助这个.
我有一个Oracle表,其中的列类型为“ SYS.XMLTYPE”,并且存储过程正在执行插入操作:
(简洁版本):
PROCEDURE InsertXML
(
pXMLData IN LONG
)
IS
BEGIN
INSERT INTO MY_TABLE (XML_DATA) VALUES(pXMLData);
END InsertXML;
Run Code Online (Sandbox Code Playgroud)
我从C#代码中以“ OracleType.LongVarChar” 类型调用此sp 。
现在的问题是:如果xml的字符数少于4000个,则一切工作正常,但是如果使用的XML字符数超过4000个,则会出现以下错误:
ORA-20000: ORA-01461: can bind a LONG value only for insert into a LONG column
Run Code Online (Sandbox Code Playgroud)
我该如何处理?Thx 4个答案