我在Oracle 11GR2上使用最新版本的DBUnit(2.4.7).我正在使用Java 6(1.6.0_15)和最新版本的Oracle客户端jar(jdbc6.jar)
我无法将XML文件中CLOB Oracle字段引用的任何数据成功加载到数据库中.
我已经使用了各种版本的组合:
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 … Postgres JDBC驱动程序似乎无法正确处理UTF-8 clobs.当您检索clob时,字符不正确(您获得了非ascii字符的标记).
据说这是一个已知问题:
幸运的是,对于我的应用程序,我通常会避免使用clobs,所以我所做的字段就是真正的大变种.
其他人如何处理这种限制?
我正在使用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.我试图在表的每一行创建一个分隔的字符串.分隔字符串的某些值必须来自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添加到分隔的字符串中?
我正在尝试执行准备好的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对象分配给参数.我也发现了以下描述,但我真的希望能够保留准备好的查询.
是否可以通过准备好的查询来完成此操作?
我附上了一个产生错误的完整示例.DESCRIPTION并且MODIFICATION_NOTES是CLOB数据库中的两列类型.
输入数据:
OracleConnection到数据库代码:
免责声明:我手动输入以下示例,可能存在实际代码中没有的错误
var query = "UPDATE master_table " +
"SET description = :description " +
" …Run Code Online (Sandbox Code Playgroud) 我有以下查询:
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)
我究竟做错了什么?还有其他可能吗?
我有这个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个字符.我怎样才能显示它...任何想法/建议?
非常感谢..
我有一个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的全部内容作为文本输出?
彼得
在hibernate(3.2.1.GA)中,我使用以下方法将CLOB类型数据插入Oracle(10g)数据库.
Hibernate.createClob(parameters.get("txtCatImage"));
Run Code Online (Sandbox Code Playgroud)
parameters是Map存储所有请求参数的地方.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在这种情况下,数据库中的字段只存储图像文件名.
我正在尝试在具有 CLOB 列的 DB2 表中插入一些行。我发现的限制是我无法插入大于 32KB 的字符串常量,并且无法缩短它,因为它是JSON String. 我愿意使用它,因为它是从网络服务(一种模拟服务)返回的。
我实际上正在使用DbVisualizer(免费),我认为这可能会让事情变得更难。
我正在从中读取数据Spring WebApp,最终我可以尝试创建一个批处理来插入从文件中读取数据的行。
我尝试过使用 DB2 IMPORT 和 LOAD 命令,但这些命令(当然)在 DB2 SQL 命令中不会被识别为 SQL 命令。
您对我可能做错了什么有什么想法,或者我必须使用哪些其他选项来插入字符串常量> 32KB 的行?