Код, который у меня есть в 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