相关疑难解决方法(0)

如何在Oracle表中插入/更新更大尺寸的数据?

我想插入字符长度超过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)

oracle clob oracle10g

14
推荐指数
1
解决办法
3万
查看次数

ORA-01461用于继承char(1字节)列 - 需要使用Spring JDBC(扩展StoredProcedure)使其工作

我有这样的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)

java plsql jdbc spring-jdbc oracle11g

12
推荐指数
1
解决办法
532
查看次数

ORA-01461/BLOB/Hibernate

我有一个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.DBConversionoracle.jdbc.driver.OracleConversionInputStream.

一切都看起来不错,只要这段代码可以认为OK :)

请告知如何跟踪此问题...可能在Oracle端(?)...可能正在寻找一些隐式转换...可能是我错过了一些关于此问题的已知Oracle metalink文章?

java oracle jdbc

6
推荐指数
1
解决办法
2233
查看次数

Oracle 10:使用HEXTORAW填充blob数据

我们在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.

sql oracle blob varbinary

6
推荐指数
2
解决办法
8661
查看次数

N-Hibernate与Oracle中的长字符串会导致错误

我使用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列." 同时将对象保存到数据库中.任何人都可以帮助这个.

c# oracle nhibernate fluent-nhibernate

4
推荐指数
1
解决办法
2271
查看次数

将超过4000个字符的XML插入Oracle XMLTYPE列

我有一个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个答案

xml oracle insert ora-01461 ora-20000

2
推荐指数
1
解决办法
1万
查看次数