java - ORA-29531 : no method %s in class %s call java source in oracle PLSQL

标签 java sql plsql oracle11g

我在 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/

相关文章:

java - 无法引用初始化程序中的静态枚举字段?

sql - 如何在子触发器中访问父表的已删除行

mysql - 一个脚本(每周)清空我数据库中的一个表

sql - 比较变量中的日期,检查它们是否按升序排列

oracle - 在 PL/SQL 中打印记录字段

java - Sonar 多模块 Gradle Android 忽略projectBaseDir

java - Spring Security Kerberos + AD,校验和失败

java - JScrollBar 箭头按钮的 MouseListener

Oracle SQL - 分配到存储桶中

mysql - 如何从一组 ID 号中获取变量的 SUM? PLSQL