标签: clob

DBunit生成java.lang.ClassCastException:尝试加载CLOB字段时,java.lang.String无法强制转换为oracle.sql.CLOB

我在Oracle 11GR2上使用最新版本的DBUnit(2.4.7).我正在使用Java 6(1.6.0_15)和最新版本的Oracle客户端jar(jdbc6.jar)

我无法将XML文件中CLOB Oracle字段引用的任何数据成功加载到数据库中.

我已经使用了各种版本的组合:

  • Oracle JDBC库ojdbc5.jar,ojdbc6.jar,oracle 10 jars
  • Hibernate库等...我认为问题出在DBUnit上.请参阅下面的堆栈跟踪.

    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>3.5.0-CR-2</version>
    
    Run Code Online (Sandbox Code Playgroud)

    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>3.4.0.GA</version>
    
    Run Code Online (Sandbox Code Playgroud)

我正在运行Java 6,1.6.0_15.

我试过了:

1)使用此定义的FlatXmlDataSet

<MESSAGE msg_id="1" mtp_id="1" msg_detail="asadds" />
Run Code Online (Sandbox Code Playgroud)

2)使用此定义的XmlDataSet

<table name="MESSAGE">
    <column>MSG_ID</column>
    <column>MTP_ID</column>
    <column>MSG_DETAIL</column>
    <row>
        <value>1</value>
        <value>1</value>
        <value>dsad</value>
    </row>
</table>
Run Code Online (Sandbox Code Playgroud)

任何帮助将非常感激!

堆栈跟踪如下:

        at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:980)
ERROR [10032010 14:15:13,031] - exception creating EntityManager:  [] (MessageDAOTest.java:97)
java.lang.RuntimeException: Exception in JpaDBTestCase
        at com.ert.commons.junit4.hibernate.JpaDBTestCase.loadDbunitFiles(JpaDBTestCase.java:97)
        at com.ert.ertmon.dao.ejb.impl.MessageDAOTest.setUpBeforeClass(MessageDAOTest.java:94)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
        at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
        at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
        at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)
        at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
        at …

java orm dbunit hibernate clob

7
推荐指数
1
解决办法
6711
查看次数

使用JDBC的Postgres UTF-8 clobs

Postgres JDBC驱动程序似乎无法正确处理UTF-8 clobs.当您检索clob时,字符不正确(您获得了非ascii字符的标记).

据说这是一个已知问题:

幸运的是,对于我的应用程序,我通常会避免使用clobs,所以我所做的字段就是真正的大变种.

其他人如何处理这种限制?

java postgresql jdbc clob utf-8

7
推荐指数
2
解决办法
4876
查看次数

将blob转换为clob

我正在使用oracle 11g,我正试图找出文本的长度.我通常会从表中使用select length(myvar),但我不能这样做.

我想查询的表有一个保存字符或照片的BLOB列.我想知道有BLOB列的字符数.

我尝试使用表中的UTL_RAW.CAST_TO_VARCHAR2(myblob)将我的BLOB转换为char,但是这个函数无法正常工作或者我犯了一个错误.

例如:我的BLOB有单词Section,当我在数据库中以十六进制形式看到这个时,我看到Section.我不知道为什么每个字母之间都有这些点.然后我使用了这个查询

select UTL_RAW.CAST_TO_VARCHAR2(myblob) 
from table
Run Code Online (Sandbox Code Playgroud)

这个查询的结果是'S',所以它不是我的BLOB所拥有的完整单词,也不是我进行此查询时的完整单词

select length(UTL_RAW.CAST_TO_VARCHAR2(myblob))
from table
Run Code Online (Sandbox Code Playgroud)

结果是18,单词Sections没有18个字符.

我试图将blob转换为varchar,虽然我认为我最好的选择是clob,因为它可以保存的文本长度超过varchar的限制.我尝试通过进行此查询来做到这一点(我不确定这是否正确,但我是在互联网上找到的)

select UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(myblob, 32767, 1))
from table
Run Code Online (Sandbox Code Playgroud)

此查询还返回'S'

我希望你能帮我解决这个问题.谢谢你的进步

oracle blob clob

7
推荐指数
3
解决办法
4万
查看次数

从CLOB(包含XML)中提取特定值,同时为表的每一行创建一个分隔字符串.某些行上的CLOB值可能为null

一些上下文:数据库是Oracle.我试图在表的每一行创建一个分隔的字符串.分隔字符串的某些值必须来自CLOB(包含XML).某些行上的CLOB可能为null,这就是问题所在.

例如,我有一个表:'Item',其中包含以下行:'Item_ID','Item_CD','Item_TXT'(CLOB).该表有两行.一行在'Item_TXT'中存储以下XML,另一行'Item_TXT'为空.

<OuterTag>      
    <InnerTag>test</InnerTag>   
</OuterTag>     
Run Code Online (Sandbox Code Playgroud)

我创建了以下SQL来返回分隔字符串的前3个元素:

SELECT 'Item%#'|| Item_ID ||'%#'|| Item_STAT_CD 
FROM Item; 
Run Code Online (Sandbox Code Playgroud)

这成功地运作:

项%#12345%#A

项%#123456%#A

然后我尝试添加第4个元素(来自CLOB的值).

SELECT 'Item%#'|| Item_ID ||'%#'|| Item_STAT_CD
EXTRACT(XMLTYPE(Item_TXT), '//OuterTag/InnerTag/text()').getStringVal()
FROM Item; 
Run Code Online (Sandbox Code Playgroud)

这失败并出现以下错误:

ORA-06502: PL/SQL: numeric or value error
ORA-06512: at "SYS.XMLTYPE", line 272
ORA-06512: at line 1
Run Code Online (Sandbox Code Playgroud)

我已将此问题缩小到有时Item_TXT为null且XMLTYPE()无法处理此问题.为证明这一点,我运行了以下内容:

SELECT 'Item%#'|| Item_ID ||'%#'|| Item_STAT_CD
EXTRACT(XMLTYPE(Item_TXT), '//OuterTag/InnerTag/text()').getStringVal()
FROM Item
WHERE Item_TXT IS NOT NULL; 
Run Code Online (Sandbox Code Playgroud)

这成功地运作:

项%#12345%#A#%测试

是否有任何方法可以处理整个表,如果可用则从clob中提取值,否则将null/nothing添加到分隔的字符串中?

xml sql oracle clob xmltype

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

如何使用>>准备好的查询<<使用ODP(Oracle.DataAccess)更新CLOB字段中的数据?

我正在尝试执行准备好的SQL查询,该查询更新CLOBOracle 10g数据库(10.2.0.1)中的字段.

如果我从内部执行以下查询SQL Developer并提供占位符的值,则没有问题.但是,如果我通过OracleCommand(Oracle.DataAccess.dll,版本1.102.0.1(我认为),.NET Framework 3.5)执行它,我会收到以下错误消息.请注意,我们不使用默认的oracle客户端,因为我们需要批量插入.不幸的是,给定的ODP版本和.NET Framework版本是一项艰难的要求,我们可能不会改变它.

查询:

UPDATE master_table
SET    description = :description,
       modification_notes = :modification_notes
WHERE  master_id = :master_id;
Run Code Online (Sandbox Code Playgroud)

错误:

ORA-00932:不一致的数据类型:预期 - 获得CLOB

进一步的信息:

参数分配如下:

var param_description = new OracleParameter(":description", OracleDbType.Clob);
param_description.Value = "Test";
Run Code Online (Sandbox Code Playgroud)

我试过以下的事情:

  • 插入to_clob()SQL查询
  • Oracle.DataAccess.Types.OracleClob对象分配给参数.

我也发现了以下描述,但我真的希望能够保留准备好的查询.

如何使用C#在Oracle中插入CLOB字段

是否可以通过准备好的查询来完成此操作?

我附上了一个产生错误的完整示例.DESCRIPTION并且MODIFICATION_NOTESCLOB数据库中的两列类型.


输入数据:

  • 连接:OracleConnection到数据库
  • master_id:要过滤的主键

代码:
免责声明:我手动输入以下示例,可能存在实际代码中没有的错误

var query = "UPDATE master_table " + 
            "SET description = :description " + 
            " …
Run Code Online (Sandbox Code Playgroud)

c# oracle odp.net clob .net-3.5

7
推荐指数
2
解决办法
7933
查看次数

使用JDBC从长字符串创建CLOB

我有以下查询:

select id from table1 where some_func(?) = 1;
Run Code Online (Sandbox Code Playgroud)

where some_func是一个允许其参数为VARCHAR2或CLOB的函数,并且?是一些字符串,可能非常长.

我试图使用以下代码绑定变量:

stmt.setObject(i+1, obj);
Run Code Online (Sandbox Code Playgroud)

但是如果string.length()> 4000,我会收到以下错误:

java.sql.SQLException: ORA-01460: unimplemented or unreasonable conversion requested
Run Code Online (Sandbox Code Playgroud)

原因很明显:VARCHAR2大小限制为4000个字符.

然后我尝试使用以下代码:

if(obj instanceof String && ((String) obj).length() >= 4000) {
  String s = (String) obj;
  StringReader stringReader = new StringReader(s);
  stmt.setClob(i+1, stringReader, s.length());
} else {
  stmt.setObject(i+1, obj);
}
Run Code Online (Sandbox Code Playgroud)

这给出了一个不同的错误:

ORA-22922: nonexistent LOB value
Run Code Online (Sandbox Code Playgroud)

我尝试的最后一个想法是使用oracle.sql.CLOB.createTemporary()方法创建一个CLOB 但由于以下异常而失败:

java.lang.ClassCastException:
  org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper 
  cannot be cast to oracle.jdbc.OracleConnection
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?还有其他可能吗?

java oracle jdbc clob

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

显示4000多个字符的CLOB列

我有这个CLOB列,我需要使用select语句显示它.

DBMS_LOB.SUBSTR以前把它转换成varchar2:

select DBMS_LOB.SUBSTR(T1.CLOB_COL,4000,1) CLOB_COL from T1
Run Code Online (Sandbox Code Playgroud)

我的问题是我的一些CLOBS包含超过4000个字符.我怎样才能显示它...任何想法/建议?

非常感谢..

oracle clob

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

DB2将大型CLOB(> 32KB)转换为文本?

我有一个DB2(9.5.1)表,其定义如下:

CREATE TABLE MY_TABLE 
( 
   ID INTEGER DEFAULT 0 NOT NULL, 
   TEXT CLOB(104857600), 
   PRIMARY KEY (ID) 
);
Run Code Online (Sandbox Code Playgroud)

现在,如果我想查询存储在CLOB中的实际文本字符串,我就是这样做的:

select cast(t.TEXT as varchar(32000))
  from MY_TABLE t
  where t.ID = 1;
Run Code Online (Sandbox Code Playgroud)

现在的问题是我的文本被截断了,但对于varchar,最大长度是32KB,因此该查询失败:

select cast(t.TEXT as varchar(33000))
  from MY_TABLE t
 where t.ID = 1;
Run Code Online (Sandbox Code Playgroud)

还有另一种可能性,我如何检索CLOB的全部内容作为文本输出?

彼得

db2 varchar clob

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

如何在Hibernate中将CLOB数据类型转换为String?

在hibernate(3.2.1.GA)中,我使用以下方法将CLOB类型数据插入Oracle(10g)数据库.

Hibernate.createClob(parameters.get("txtCatImage"));
Run Code Online (Sandbox Code Playgroud)

parametersMap存储所有请求参数的地方.Clob直接从数据库中检索数据类型时,这样的事情是entityObj.getCatImage()行不通的.

看到这个这个问题,但找不到方法.

以下是使用Clobtype属性的实体.

public class Category  implements java.io.Serializable {

    private Long catId; // Primary key.
    private Clob catImage; // CLOB type field.
    // Other fields.
    private static final long serialVersionUID = 1L;

    public Category() {}

    // Overloaded constructs + getters + setters + hashcode() + equals() + toString().
}
Run Code Online (Sandbox Code Playgroud)

Clob在这种情况下,数据库中的字段只存储图像文件名.

spring hibernate clob oracle10g

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

DB2 插入 clob [字符串常量太长]

我正在尝试在具有 CLOB 列的 DB2 表中插入一些行。我发现的限制是我无法插入大于 32KB 的字符串常量,并且无法缩短它,因为它是JSON String. 我愿意使用它,因为它是从网络服务(一种模拟服务)返回的。

  1. 我实际上正在使用DbVisualizer(免费),我认为这可能会让事情变得更难。

  2. 我正在从中读取数据Spring WebApp,最终我可以尝试创建一个批处理来插入从文件中读取数据的行。

  3. 我尝试过使用 DB2 IMPORT 和 LOAD 命令,但这些命令(当然)在 DB2 SQL 命令中不会被识别为 SQL 命令。

您对我可能做错了什么有什么想法,或者我必须使用哪些其他选项来插入字符串常量> 32KB 的行?

java db2 spring insert clob

6
推荐指数
0
解决办法
1523
查看次数

标签 统计

clob ×10

oracle ×5

java ×4

db2 ×2

hibernate ×2

jdbc ×2

spring ×2

.net-3.5 ×1

blob ×1

c# ×1

dbunit ×1

insert ×1

odp.net ×1

oracle10g ×1

orm ×1

postgresql ×1

sql ×1

utf-8 ×1

varchar ×1

xml ×1

xmltype ×1