我正在使用Oracle SQL Developer并尝试将表导出为CSV文件.某些字段是CLOB字段,在许多情况下,导出发生时会截断条目.我正在寻找一种方法来解决所有问题,因为我的最终目标是不在这里使用Oracle(我收到了一个Oracle转储 - 它被加载到一个oracle数据库中,但我正在使用其他格式的数据,所以通过CSV作为中间人).
如果对此有多种解决方案,鉴于对我来说这是一次性程序,我不介意更多涉及"做正确"解决方案的黑客类型解决方案.
看起来Hibernate开始使用LONG版本3.5.5中的数据类型(我们从3.2.7升级)而不是CLOB属性type="text".
这会导致问题,因为LONGOracle中的数据类型是一种旧的过时数据类型(请参阅http://www.orafaq.com/wiki/LONG),不应使用,并且表不能有多个列具有LONGas数据类型.
有谁知道为什么这个改变了?
我试图将Oracle SetBigStringTryClob属性设置为true(如Hibernate> CLOB> Oracle :()中所建议的那样,但这不会影响数据类型映射,只会影响与我的情况无关的数据传输内部.
一个可能的解决方法是覆盖org.hibernate.dialect.Oracle9iDialect:
public class Oracle9iDialectFix extends Oracle9iDialect {
public Oracle9iDialectFix() {
super();
registerColumnType(Types.LONGVARCHAR, "clob");
registerColumnType(Types.LONGNVARCHAR, "clob");
}
}
Run Code Online (Sandbox Code Playgroud)
然而,这是最后的手段 - 覆盖这个类更接近于分支Hibernate,我宁愿避免这样做.
任何人都可以解释为什么这样做了吗?这应该是一个bug吗?
[更新]:我创建了http://opensource.atlassian.com/projects/hibernate/browse/HHH-5569,让我们看看会发生什么.
警告:请参阅下面的答案.此问题是由除10.2.0.4之外的类路径中存在的旧Oracle驱动程序引起的.问题解决了.留下这个问题的其余部分给后人.
我一直在抨击以下内容.这是从我的应用程序代码中提取的简单POJO:
@Entity
@Table(name = "PIGGIES")
public class Piggy {
private Long id;
private String description;
public Piggy() {}
@Id
@GeneratedValue
@Column(name = "PIGGY_ID")
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
@Lob
@Column(name = "PIGGY_DESCRIPTION")
public String getDescription() { return description; }
public void setDescription(String d) { description = d; }
}
Run Code Online (Sandbox Code Playgroud)
有一个String属性和一个CLOB列.当内容很短(例如"hello world")时,它会持续很好.使用更长的字符串,我得到以下异常:
java.sql.SQLException: operation not allowed: streams type cannot be used in batching
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
at …Run Code Online (Sandbox Code Playgroud) 我们在Oracle 11g中有一个带有varchar2列的表.我们使用专有的编程语言,其中此列定义为字符串.最大值我们可以在此列中存储2000个字符(4000个字节).现在要求是列需要存储超过2000个字符(实际上是无限字符).出于维护原因,DBA不喜欢BLOB或LONG数据类型.
我能想到的解决方案是从原始表中删除此列,并为此列创建一个单独的表,然后将每个字符存储在一行中,以获得无限制的字符.此tble将与原始表连接以进行查询.
有没有更好的解决方案来解决这个问题?
更新:专有编程语言允许定义string和blob类型的变量,没有CLOB选项.我理解给出的回复,但我无法接受DBA.我明白偏离BLOB或LONG将是开发人员的噩梦,但仍然无法帮助它.
更新2:如果我需要的最大值是8000个字符,我可以再添加3个列,这样我就会有4个列,每个列有2000个字符,可以获得8000个字符.因此,当第一列填满时,值将溢出到下一列,依此类推.这个设计会有什么不好的副作用吗?请建议.
1)我必须从oracle select query中创建json,它有三种方法我可以遵循.
SELECT JSON_ARRAY(json_object('id' VALUE employee_id,
'data_clob' VALUE data_clob
)) from tablename;
Run Code Online (Sandbox Code Playgroud)
我也试过这种方法
2)如果您无法修补/使用该版本,那么Lewis Cunningham和Jonas Krogsboell撰写的优秀软件包:PL/JSON*http://pljson.sourceforge.net/
这是一个很好的包(我在很多数据库安装中都使用它).
包含的示例很好,涵盖了大多数情况.
declare
ret json;
begin
ret := json_dyn.executeObject('select * from tab');
ret.print;
end;
/
Run Code Online (Sandbox Code Playgroud)
提及在这个答案中也是如此,但不适用于这样的大事. 在oracle 12c中将sql查询的结果作为JSON返回
3)另一种方法是我们可以在select查询之后连接字符串.
FOR rec IN (SELECT employee_id, data_clob
FROM tablename) LOOP
IF i <> 1 THEN
v_result := v_result || ',';
END IF;
v_result := v_result || '{"employee_id":' || to_char(rec.employee_id) || ',"data_clob": ' || rec.data_clob || '}';
i := i + 1; …Run Code Online (Sandbox Code Playgroud) 我正在使用Hibernate Tools 3.2.1.GA和Spring 3.0.2版.我想将数据插入到Oracle(10g)数据库字段中clob,如下所示.
Clob c=Hibernate.createClob(request.getParameter("someTextFieldValueOnJSPPage");
pojoObj.setSomeClobProperty(c);
Run Code Online (Sandbox Code Playgroud)
它工作得很好但是当我尝试使用CKEditor插入数据流时, 我的JSP页面上的demo(CKEditor只是呈现HTML <textarea></textarea>元素)可能涉及格式化文本以及图像,flash等,它会抛出以下异常.
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.exception.GenericJDBCException: could not update: [model.Cms#1]
Run Code Online (Sandbox Code Playgroud)
org.hibernate.exception.GenericJDBCException: could not update: [model.Cms#1]
Run Code Online (Sandbox Code Playgroud)
java.sql.SQLException: operation not allowed: streams type cannot be used in batching
Run Code Online (Sandbox Code Playgroud)
如何解决该异常?这是Oracle驱动程序问题还是其他什么问题?我正在使用ojdbc14.jar,Oracle JDBC Driver version - 9.0.2.0.0.
更新:
使用该Clob类型的实体之一是
public class Cms implements java.io.Serializable
{
private BigDecimal cmsId;
private Clob aboutUs; //I'm currently dealing with this …Run Code Online (Sandbox Code Playgroud) 表:客户
ID NAME DATATYPE
NUMBER VARCHAR2(100) CLOB
Run Code Online (Sandbox Code Playgroud)
我想将DATA列更改CLOB为`VARCHAR2(1000)
我曾经尝试ALTER TABLE customers MODIFY DATA VARCHAR2 (1000)也
ALTER TABLE customers MODIFY (DATA VARCHAR2 (1000))
也
alter table customers modify
(data VARCHAR2(4000))
Run Code Online (Sandbox Code Playgroud)
如果数据类型不是clob但通常是有效的,ORA-22859因为我使用的是oracle toad/apex.
我试图读取blob消息并在我的一个过程中将其显示为变量,但我收到以下错误:
错误 - ORA-22835:缓冲区对于CLOB到CHAR或BLOB到RAW的转换太小(实际:9923,最大值:2000)
我用google搜索并找到了修改blob消息的建议,如下所示,但宁愿将完整的blob消息显示为字符串.
UTL_RAW.CAST_TO_VARCHAR2(dbms_lob.substr(variable_name,2000,1))
Run Code Online (Sandbox Code Playgroud)
如何显示完整的消息?我可以更改数据库或过程级别的设置吗?
.dmp是在Oracle 10g(Express Edition)中构建的表的转储,其中一个字段是CLOB类型.
我试图简单地将表导出到xml/csv文件然后将其导入MySql,但导出只是忽略了CLOB字段...(我之前使用的是sqldeveloper).
我注意到这篇文章解释了如何将CLOB提取到文本文件,但似乎错过了对其他字段或至少主键字段的处理.是否可以通过创建完整表的csv?(我根本不熟悉plsql)
随着蛮力的方法,我可以使用我的python接口简单地查询所有记录并将其假脱机到一个平面文件,但我担心它将需要一个LOOOONG时间(查询所有记录用ascii替换所有本机逗号. ..)
多谢你们!
从这两个线程,
LONG过时且不赞成使用.甲骨文说,
不要创建包含LONG列的表.请改用LOB列(CLOB,NCLOB).仅支持LONG列以实现向后兼容性.
Oracle还建议您将现有的LONG列转换为LOB列.与LONG列相比,LOB列的限制要少得多.此外,LOB功能在每个版本中都得到了增强,而LONG功能在几个版本中都是静态的.
但是,如果没有此处提到的解决方法,您无法从远程数据库中读取CLOB .
我应该更喜欢在表格中存储一些文字?还是有比这两个更好的解决方案?