【发布时间】: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