gpt4 book ai didi

java - Oracle Java 存储函数 - ORA-00932 : inconsistent datatypes

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:24:46 24 4
gpt4 key购买 nike

尝试调用 java 存储函数并取回 java 对象并将其转换为 oracle 类型。这是一个 10g 的数据库,我们使用的是 Java 1.4.2。 (我知道升级是答案,不幸的是我受限于这个环境。)

下面列出了代码和错误。

如有任何帮助,我们将不胜感激。

测试映射.java

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

return 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

预言机类型:

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

要测试的匿名 block :

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 Java 存储函数 - ORA-00932 : inconsistent datatypes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23117824/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com