Oracle Java存储函数-ORA-00932:不一致的数据类型

Oracle Java存储函数-ORA-00932:不一致的数据类型,java,sql,oracle,stored-procedures,oracle10g,Java,Sql,Oracle,Stored Procedures,Oracle10g,试图调用java存储函数并获取java对象并将其转换为oracle类型。 这是一个10g数据库,我们使用的是Java1.4.2。(我知道升级就是答案,不幸的是,我受此环境的限制。) 下面列出的代码和错误 任何帮助都将不胜感激 TestMapping.java public class TestMapping { public static TestObject getResponse(){ TestObject testObject = new TestObject();

试图调用java存储函数并获取java对象并将其转换为oracle类型。 这是一个10g数据库,我们使用的是Java1.4.2。(我知道升级就是答案,不幸的是,我受此环境的限制。)

下面列出的代码和错误

任何帮助都将不胜感激

TestMapping.java

public class TestMapping {
    public static TestObject getResponse(){
        TestObject testObject = new TestObject();
        testObject.setMyTestValue("TEST");

        return testObject;
    }
}
TestObject.java

import java.sql.SQLData;
import java.sql.SQLException;
import java.sql.SQLInput;
import java.sql.SQLOutput;

public class TestObject implements SQLData {
    private String myTestValue;

    private String sqlTypeName;
    public String getSQLTypeName() throws SQLException {
        return sqlTypeName;
    }

    public void readSQL(SQLInput stream, String typeName) throws SQLException {
        sqlTypeName = typeName;
        myTestValue = stream.readString();
    }

    public void writeSQL(SQLOutput stream) throws SQLException {
        stream.writeString(myTestValue);
    }

    public String getMyTestValue() {
        return myTestValue;
    }

    public void setMyTestValue(String myTestValue) {
        this.myTestValue = myTestValue;
    }
}
命令行:

javac TestObject.java
javac TestMapping.java
loadjava -user user/pass@server:1521:instance -t -r TestObject.class
loadjava -user user/pass@server:1521:instance -t -r TestMapping.class
Oracle类型:

create or replace
type test_object  as object(
myTestValue  varchar2(50));
发布Java函数:

create or replace
FUNCTION test_mapping RETURN test_object
AS LANGUAGE JAVA
NAME 'TestMapping.getResponse() return TestObject';
要测试的匿名块:

set serveroutput on;
declare 
  response test_object; 
begin
  response := test_mapping();
  DBMS_OUTPUT.PUT_LINE('myTestValue : ' || response.myTestValue);
end;
错误:

Error report:
ORA-00932: inconsistent datatypes: expected a return value that is an instance of a user defined Java class convertible to an Oracle type got an object that could not be converted
ORA-06512: at "USER.TEST_MAPPING", line 1
ORA-06512: at line 4
00932. 00000 -  "inconsistent datatypes: expected %s got %s"
*Cause:
*Action:

您需要返回
oracle.sql.STRUCT
的实例,而不是自定义Java类型的实例。这在您的Oracle出版物中都是正确的

create or replace
FUNCTION test_mapping RETURN test_object
AS LANGUAGE JAVA
NAME 'TestMapping.getResponse() return oracle.sql.STRUCT';
。。。在Java类中

public static oracle.sql.STRUCT getResponse(){ ...
要构建
getResponse()
必须返回的结构,需要执行以下操作:

// This is the object you really want to pass back
TestObject result;

STRUCT oracleResult;
try{
  StructDescriptor resultStructDescriptor = StructDescriptor.createDescriptor("TEST_OBJECT", yourOracleConnection);

  Object[] attributes = {result.myTestValue};
  oracleResult = new STRUCT(resultStructDescriptor, yourOracleConnection, attributes);
} catch ( SQLException e ) {
    throw new RuntimeException(e);
}
return oracleResult;

您能解释一下为什么要将java对象返回到oracle中吗。你打算用那个东西做什么?您最好返回对象的属性,或者如果您只想存储对象,请使用blob并将对象持久化到数据库表中的blob字段。我正在尝试调用real time CC auth。据Oracle称,10G钱包不支持SHA2。因此,我创建了一个java存储函数来通过SSL调用web服务,并希望返回一个与Oracle类型匹配的对象。我基本上解决了这个问题,将一个JSON字符串返回到PL/SQL并用PLJSON进行解析?从技术上讲,我已经在数据库中了,因为我正在数据库中运行jvm?Connection conn=DriverManager.getConnection(“jdbc:default:Connection:”);我已经找到了,但我觉得在这种情况下,这是一个非常重要的信息。谢谢你,伙计!