【问题标题】:Oracle Java Stored Function - ORA-00932: inconsistent datatypesOracle Java 存储函数 - ORA-00932:不一致的数据类型
【发布时间】:2014-05-31 19:41:50
【问题描述】:

尝试调用 java 存储函数并取回 java 对象并将其转换为 oracle 类型。 这是一个 10g 的数据库,我们使用的是 Java 1.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:

【问题讨论】:

  • 你能解释一下为什么要将java对象返回到oracle。你打算用那个物体做什么?您最好返回对象的属性,或者如果您只想存储对象使用 blob 并将对象持久保存到数据库表中的 blob 字段
  • 我正在尝试调用实时 CC auth。根据 Oracle 的 10G 钱包不支持 SHA2。因此,我创建了一个 java 存储函数来通过 SSL 调用 Web 服务,并且我想返回一个与 Oracle 类型匹配的对象。我基本上解决了它并将一个 JSON 字符串返回给 PL/SQL 并用 PLJSON 解析。

标签: java sql oracle stored-procedures oracle10g


【解决方案1】:

您需要返回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() 必须返回的 STRUCT,您需要执行以下操作:

// 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;

【讨论】:

  • 我如何获得“yourOracleConnection”?从技术上讲,我已经在数据库中,因为我在数据库中运行 jvm?
  • 连接连接 = DriverManager.getConnection("jdbc:default:connection:");
  • 我已经找到了,但我觉得在这种情况下,信息有点重要。谢谢老兄!
猜你喜欢
  • 1970-01-01
  • 2011-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多