ORA-29531: нет метода% s в классе% s, вызовите источник java в Oracle Oracle - PullRequest
0 голосов
/ 08 ноября 2018

Код, который у меня есть в PLSQL:

    CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "ConversorSQL" AS
  package test;
  import java.util.Calendar;
  import java.sql.Connection;
  import java.sql.DriverManager;
  import java.sql.ResultSet;
  import java.sql.SQLException;
  import java.sql.Statement;

  import java.io.FileReader;
  import java.io.IOException;

  public class ConversorSQL {  
    public static String runConversor(String tipoOperacion, String nombreTabla, String queryOpcional) {
      return "Hola";
    }
  }

А потом:

CREATE OR REPLACE FUNCTION f_conversorSQL(p_tipo VARCHAR2,
                                      p_tabla VARCHAR2,
                                      p_query VARCHAR2) RETURN VARCHAR2 IS LANGUAGE JAVA NAME 'test.ConversorSQL.runConversor(String, String, String) return String';

И я называю это с:

  SELECT f_conversorSQL( 'Hello there!',
                       'General Kenobi',
                       'You are a bold one')
 FROM DUAL;

И я получаю ошибку в заголовке:

Error que empieza en la línea 1 del comando:
SELECT f_conversorSQL( 'Hello there!',
                       'General Kenobi',
                       'You are a bold one')
FROM DUAL;
Informe de error -
Error SQL: ORA-29531: ningún método runConversor en la clase ConversorSQL
29531. 00000 - "no method %s in class %s"
*Cause: An attempt was made to execute a non_existent method in a Java class.
*Action: Adjust the call or créate the specified method.

Я не понимаю, почему он не может достичь метода. И JAVA SOURCE, и FUNCTION правильно компилируются. Но, и вот тут начинается самое интересное, этот код работает правильно и не выдает ошибку

CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "JavaDate" AS
  package pruebas;
  import java.util.Calendar;
  import java.sql.Connection;
  import java.sql.DriverManager;
  import java.sql.ResultSet;
  import java.sql.SQLException;
  import java.sql.Statement;

  import java.io.FileReader;
  import java.io.IOException;

  public class JavaDate {  
    public static String getString(int anho, int mes, int dia, int hora, int minuto, int segundo) {
      return "hola";
    }
  }

То же, что и раньше:

    CREATE OR REPLACE FUNCTION f_javadate(p_anho NUMBER,
                                      p_mes NUMBER,
                                      p_dia NUMBER,
                                      p_hora NUMBER,
                                      p_minuto NUMBER,
                                      p_segundo NUMBER) RETURN VARCHAR2 IS LANGUAGE JAVA
 NAME 'pruebas.JavaDate.getString(int, int, int, int, int, int) return String';

То же, что и раньше:

SELECT f_javadate(TO_NUMBER(TO_CHAR(SYSDATE, 'YYYY')),
                  TO_NUMBER(TO_CHAR(SYSDATE, 'MM')),
                  TO_NUMBER(TO_CHAR(SYSDATE, 'DD')),
                  TO_NUMBER(TO_CHAR(SYSDATE, 'HH24')),
                  TO_NUMBER(TO_CHAR(SYSDATE, 'MI')),
                  TO_NUMBER(TO_CHAR(SYSDATE, 'SS')))
 FROM DUAL;

Они выглядят примерно одинаково, я только изменил имя пакета, имя функции и количество параметров.

Я работаю с Oracle 11g, версия Java 1.5.0_10, среда SQL Developer 4.0.1

1 Ответ

0 голосов
/ 08 ноября 2018

Для вызова функции источника java используйте CALL :

 VARIABLE myString VARCHAR2(20);
 CALL f_conversorSQL( 'Hello there!',
                   'General Kenobi',
                   'You are a bold one') 
 INTO :myString;

Вызовите хранимую процедуру следующим образом:

SQL> VARIABLE myString VARCHAR2(20);

SQL> CALL helloworld() INTO :myString;

оператор выполняет вызов верхнего уровня в базе данных Oracle. SQL и PL / SQL не видят разницы между хранимой процедурой, написанной на Java, PL / SQL или любом другом языке.

Определите функцию с помощью java.lang.String:

CREATE OR REPLACE FUNCTION f_conversorSQL(p_tipo VARCHAR2,
                                  p_tabla VARCHAR2,
                                  p_query VARCHAR2) RETURN VARCHAR2 AS LANGUAGE JAVA NAME 'test.ConversorSQL.runConversor(java.lang.String, java.lang.String, java.lang.String) return java.lang.String';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...