繁体   English   中英

如何在存储过程中将 Java 字符串转换为 Oracle Clob

[英]How to convert Java String to Oracle Clob in stored procedure

我有一个程序如下

create or replace PROCEDURE  PROCESS_MESSAGE(
    MESSAGE_ENTITY IN T_MESSAGE_ENTITY,
    STATUS OUT VARCHAR2
.
.

其中T_MESSAGE_ENTITY是具有某些字段为CLOB的类型

create or replace TYPE T_MESSAGE_ENTITY FORCE AS OBJECT (
COLS CLOB,
VALS CLOB
.
.
)

我必须将T_MESSAGE_ENTITY作为输入参数传递给过程,其中包含我使用 ARRAY 尝试过的这些CLOB值。

objMsgEntityArray[0] = colString.getBytes();
objMsgEntityArray[1] = valString.getBytes();

并使用callableStmt.setObject()传递这个对象

它给了我以下错误。

将数据合并到问题 table.java.sql.SQLException 时发生 SQLException:无法转换为内部表示:[B@3cbbfe22 at oracle.jdbc.oracore.OracleTypeCLOB.toDatum(OracleTypeCLOB.java:71)

如果您想在 java 中使用 udt(用户定义类型),您必须使用 java.sql.SQLData 接口创建映射类或利用 STRUCT 类。 在我的示例中,我将使用第二个选项

您的类型和程序。

create or replace TYPE T_MESSAGE_ENTITY FORCE AS OBJECT (
  COLS CLOB,
  VALS CLOB    
);

create or replace PROCEDURE  PROCESS_MESSAGE(
    MESSAGE_ENTITY IN T_MESSAGE_ENTITY,
    STATUS OUT VARCHAR2) 
    is 
    begin         
     status := MESSAGE_ENTITY.cols||'-'|| MESSAGE_ENTITY.VALS;        
    end;

爪哇:

StructDescriptor structdesc = StructDescriptor.createDescriptor("T_MESSAGE_ENTITY", con);
        Clob clob1 = con.createClob();
        clob1.setString(1,"First paramter");
        Clob clob2 = con.createClob();
        clob2.setString(1,"Secound paramter");
        Object[] attributes = {clob1,clob2};
        STRUCT struct = new STRUCT(structdesc, con, attributes);        
        String CALL_PROC = "{call PROCESS_MESSAGE(?,?)}";
        CallableStatement  callableStatement = con.prepareCall(CALL_PROC);
        callableStatement.setObject(1, struct, Types.STRUCT);
        callableStatement.registerOutParameter(2, java.sql.Types.VARCHAR);
        callableStatement.executeUpdate();
        System.err.println(callableStatement.getString(2));

您不需要关闭/取消选中 Wrap Data Types 。 另一种解决方法是使用以下代码

    if(obj instanceof weblogic.jdbc.wrapper.Clob) {
      weblogic.jdbc.wrapper.Clob clob = (weblogic.jdbc.wrapper.Clob)st1.getObject(2);
      **Clob oc = (oracle.sql.CLOB)clob.unwrap(Class.forName("oracle.sql.CLOB"));**
    }

我已经通过使用以下代码创建 CLOB 对象解决了这个问题 -

oracle.jdbc.OracleClob clobCols = (oracle.jdbc.OracleClob) conn.createClob();
clobCols.setString(1, "String value")

您需要做的第二件事是取消选中您已为其获取数据库连接的数据源的“Wrap Data Types”属性。 即使在生产环境中,最好取消选中此属性,因为这样做会提高应用程序的性能。

By default, data type objects for Array, Blob, Clob, NClob, Ref, SQLXML, and Struct, 
plus ParameterMetaData and ResultSetMetaData objects are wrapped with a WebLogic 
wrapper.Which converts or wrappes Oracle type to Weblogic type which is extra and 
expensive operation so it is recommended to uncheck this property for getting better 
performance.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM