使用Java类定义Oracle对象类型的构造方法问题

时间:2018-11-18 12:33:21

标签: java sql oracle plsql

我已经在Oracle中基于Java类创建了一个对象,但是我不知道如何定义构造函数。

例如,我有这样的Java类,并将其加载到Oracle DB中:

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

public class Foo implements SQLData {
    public int bar;

    public Foo() {
        this.bar = 0;
    }

    private String sql_type;

    @Override
    public String getSQLTypeName() throws SQLException {
        return sql_type;
    }

    @Override
    public void readSQL(SQLInput stream, String typeName) throws SQLException {
        bar = stream.readInt();
        sql_type = typeName;
    }

    @Override
    public void writeSQL(SQLOutput stream) throws SQLException {
        stream.writeInt(bar);
    }
}

然后在Oracle中,我正在创建如下对象:

CREATE OR REPLACE TYPE foo AS OBJECT 
    EXTERNAL NAME 'Foo' LANGUAGE JAVA
    USING SQLDATA(
        bar NUMBER EXTERNAL NAME 'bar',

        CONSTRUCTOR FUNCTION foo RETURN SELF AS RESULT EXTERNAL NAME 'Foo() return Foo'
    )
;

但是每次尝试将其与构造函数一起使用时,都会出现这样的错误:

ORA-29540:类oracle.aurora.sqljtype.SQLJ7380A743BCB64E4FAFE99F03EBECF627不存在。

有人可以解释我在基于Java类创建Oracle对象时如何定义构造函数吗?

1 个答案:

答案 0 :(得分:0)

您告诉默认的ctor如何初始化bar int,但是您对类型一无所知:

public class Foo implements SQLData {

    private static final int DEFAULT_BAR = 0;
    private static final String DEFAULT_TYPE = "SOMETHING";

    public int bar;
    private String sql_type;

    public Foo() {
        this(DEFAULT_BAR, DEFAULT_TYPE);
    }

    public Foo(int x, String type) { 
        this.bar = x;
        this.sql_type = type;
    }
}

您编写的方式为空。那是你想要的吗?