Концепция: Сборка Java-программы и загрузка ее в Oracle DB - функция Wrapper вызывает функцию Java с возвратом - PullRequest
0 голосов
/ 24 мая 2018

Допустим, я получил следующую Java-функцию:

public class Example {

public String getHelloWorld(String hello) {
    return hello + "world"
 }

}

Я вызываю метод getHelloWorld ("hello"), и функция возвращает мне "hello world" в качестве возврата.Через начальный класс (только основной метод) я создаю новый «Пример» и вызываю нестатическую функцию getHelloWorld.Здесь все хорошо.

Теперь я хочу поместить этот класс в базу данных Oracle: с помощью следующей команды он работает как положено;PLSQL:

create or replace java source named "com.test.Example" as
public class Example { [...]

Теперь я получил ответ из базы данных, что исходный код Java был успешно создан.

Теперь я пытаюсь исправить функцию-обертку, чтобы позже вызвать мою функцию из pl / sql: function get_hello_world(i_string VARCHAR2) RETURN VARCHAR2 AS LANGUAGE java name 'com.test.Example.getHelloWorld( java.lang.String ) return java.lang.String';

Теперь у меня есть несколько вопросов: работает ли все это вместе?Могу ли я вызвать нестатический метод, такой как «getHelloWorld», как я это делал здесь в примере?

Если возможен только статический метод, нужно ли мне писать метод main?Если да, как я могу получить доступ к возврату в PL / SQL?С моей точки зрения, метод main не имеет возврата.

Может ли кто-нибудь подсказать мне, как получить решение?

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Я сделал это с помощью всех вас!С помощью более специфического билета ORA-29531: нет метода в классе error Я смог исправить свою проблему.Тебя @MTO за воспитание прав думал.Если кто-то заинтересован в моем решении, посмотрите ответ на этот связанный билет.

Ключевые части:

  1. Убедитесь, что библиотека Java успешно загружена в базу данных.Либо командой pl / sql, как я описал в моем вопросе.Но всегда есть вероятность, что нужная библиотека уже загружена в вашу базу данных, но вы этого не знали.Чтобы проверить этот факт, используйте SELECT * FROM ALL_OBJECTS WHERE OBJECT_TYPE LIKE '%JAVA%' AND OBJECT_NAME LIKE '%ColognePhonetic%'

  2. Вы не можете запускать нестатические функции напрямую!Обязательно напишите статическую функцию, в которой вы просто создаете экземпляр объекта несатической функции и вызываете нужную функцию.Пример:

    create or replace java source named "com.test.Example" AS public class Example { public String getHelloWorld ( final String hello ) { return hello + "world" } public static String getStaticHelloWorld(final String hello){ final Example e = new Example(); return e.getHelloWorld( hello ); } }

  3. Напишите функцию обертки, которая запускает вновь созданную статическую функцию.

    CREATE FUNCTION get_hello_world(i_string VARCHAR2) RETURN VARCHAR2 AS LANGUAGE java name 'com.test.Example.getStaticHelloWorld( java.lang.String ) return java.lang.String';

  4. Убедитесь, что для правильного вызова функции PL / SQL!declare result varchar2(20); begin -- Call the function result := get_hello_world('hello'); end; или SQL:

select get_hello_world('hello') from dual;

0 голосов
/ 24 мая 2018

Да, вам нужно вызвать статический метод, но внутри статического метода вы можете создать экземпляр класса и вызвать нестатические методы:

create or replace java source named "com.test.Example" AS
public class Example {
  public String getHelloWorld(
    final String hello
  ) {
    return hello + "world"
  }

  public static String getStaticHelloWorld(
    final String hello;
  ){
    final Example e = new Example();
    return e.getHelloWorld( hello );
  }
}
/

CREATE FUNCTION get_hello_world(i_string VARCHAR2) RETURN VARCHAR2 AS
  LANGUAGE java name 'com.test.Example.getStaticHelloWorld(
      java.lang.String
    ) return java.lang.String';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...