Я пытаюсь сделать объект oracle, функция члена которого вызывает java-метод. Он должен быть функцией-членом, а не статической функцией.
Класс Java:
Create or Replace Java Source Named "Hello" As
public class Hello {
public String World() { return "Hello World!"; }
}
Объект:
Create or replace type T_HelloW as object(
helloID int,
member function HelloWorld return varchar2 as
language java name 'Hello.World() return java.lang.String');
Создание таблицы и вставка данных:
create table hellos of T_HelloW;
insert into hellos values(1);
Но когда я пытаюсь это назвать:
select h.HelloWorld() from hellos h;
Я получаю ошибку:
ORA-00932: непоследовательные типы данных: ожидается, что аргумент IN в позиции 1, являющийся экземпляром типа конвертирования Oracle для экземпляра пользовательского класса Java, получил тип Oracle, который не может быть преобразован в класс java
* Причина:
* Действие:
У меня есть красный http://docs.oracle.com/cd/B19306_01/java.102/b14187/chsix.htm#BABJJFJC Фактически единственная информация, которую я нашел об этом. И я не вижу, что мне не хватает или что-то не так.
Решение такое, как предложил Сильвен Леру. Придется реализовать интерфейс SQLData:
Create or Replace Java Source Named "Hello" As
import java.sql.*;
import java.io.*;
public class Hello implements SQLData {
private int helloId;
public String World() { return "Hello World!"; }
String sql_type;
public String getSQLTypeName() throws SQLException {
return sql_type;
}
public void readSQL(SQLInput stream, String typeName) throws SQLException {
sql_type = typeName;
helloId = stream.readInt();
}
public void writeSQL(SQLOutput stream) throws SQLException {
stream.writeInt(helloId);
}
}