Функция-член объекта PL / SQL - метод Java

1

Я пытаюсь сделать объект 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

  1. 00000 - "непоследовательные типы данных: ожидаемые% s получены% s"

* Причина:
* Действие:

У меня есть красный http://docs.oracle.com/cd/B19306_01/java.102/b14187/chsix.htm#BABJJFJC Фактически единственная информация, которую я нашел об этом. И я не вижу, что мне не хватает или что-то не так.

  • 1
    Это то, чего я никогда не делал раньше, поэтому я не могу дать вам должного совета, но вы прочитали документ до конца? Особенно часть о реализации SQLData ?
  • 0
    Я не уверен на 100%, но думаю, что это не связано с проблемой. Как говорится: чтобы сделать доступ к атрибутам объекта более естественным, создайте класс Java, который реализует интерфейс SQLData. В этом случае мне даже не нужен доступ к атрибутам объекта.
Показать ещё 2 комментария
Теги:
plsql
oracle11g

1 ответ

1
Лучший ответ

Решение такое, как предложил Сильвен Леру. Придется реализовать интерфейс 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);
  }
}
  • 0
    Но как мне вернуть вложенные объекты?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню