我在 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
最佳答案
调用java源函数使用CALL :
VARIABLE myString VARCHAR2(20);
CALL f_conversorSQL( 'Hello there!',
'General Kenobi',
'You are a bold one')
INTO :myString;
Call the stored procedure, as follows:
SQL> VARIABLE myString VARCHAR2(20); SQL> CALL helloworld() INTO :myString;
statement performs a top-level call in Oracle Database. SQL and PL/SQL see no difference between a stored procedure that is written in Java, PL/SQL, or any other language.
使用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';
关于java - ORA-29531 : no method %s in class %s call java source in oracle PLSQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53204456/