java.sql.SQLException:调用中的参数无效:对用户定义的类型和引用类型使用setNull

java.sql.SQLException:调用中的参数无效:对用户定义的类型和引用类型使用setNull,java,plsql,Java,Plsql,我正在尝试使用Java调用一个存储过程 我已经检查过类似的错误,并且已经尝试过复制解决方案,但仍然存在错误 java.sql.SQLException:调用中的参数无效:对用户定义的类型和引用类型使用setNull(int-parameterIndex、int-sqlType、String-typeName) import java.sql*; public class FusionDBConnection { public static void main(String args[]) {

我正在尝试使用Java调用一个存储过程

我已经检查过类似的错误,并且已经尝试过复制解决方案,但仍然存在错误

java.sql.SQLException:调用中的参数无效:对用户定义的类型和引用类型使用setNull(int-parameterIndex、int-sqlType、String-typeName)

import java.sql*;

public class FusionDBConnection {

public static void main(String args[]) {
    System.out.println("RUN PROCESS START");

    try {

        Class.forName("oracle.jdbc.driver.OracleDriver");

        Connection dbConn = DriverManager.getConnection("jdbc:oracle:thin:@10.XX.XXX.XXX:1521:AAA1", "TEST", "TESTPASS");

        CallableStatement cst = dbConn.prepareCall("{call EDGF.FMW_SELECT_PACS_SEQ(?,?,?,?)}");

        cst.setString(1,"A");
        cst.setString(2, "B");
        cst.setString(3,"C");
        cst.setNull(4, java.sql.Types.REF);
        cst.registerOutParameter(4,Types.REF);

        ResultSet outData = (ResultSet)cst.getObject(4); 

        while (outData.next()) {
            System.out.println(outData.getString(4));
        }
        dbConn.close();
        System.out.println("RUN PROCESS END");
    } catch (Exception e) {
        e.printStackTrace();
    }

}
}
存储过程

create or replace 
PROCEDURE FMW_SELECT_PACS_SEQ 
(
  IN_RECORDTYPE IN VARCHAR2  
, IN_CODE IN VARCHAR2 
, IN_GENERATIONNUMBER IN VARCHAR2 
, PACSSEQRESULTS OUT SYS_REFCURSOR
) AS 
SELECTPACSSEQ VARCHAR2(10000);
BEGIN
--SELECT PACS_SEQ
SELECTPACSSEQ := 

'SELECT RECORD_TYPE, CODE, GENERATION_NUMBER, STATUS, LAST_UPDATED_BY, LAST_UPDATE_DATE FROM EDGF.EDGF_PACS_SEQUENCES 
WHERE RECORD_TYPE ='''||IN_RECORDTYPE||''' AND CODE = '''||IN_CODE||'''AND GENERATION_NUMBER ='''||IN_GENERATIONNUMBER||'''';
OPEN PACSSEQRESULTS FOR SELECTPACSSEQ;

END FMW_SELECT_PACS_SEQ;          

从我所读到的内容来看,您不应该在OUT参数上调用setter,因为它不是为接收来自外部的任何输入值而设计的。因此,请删除此行:

cst.setNull(4, java.sql.Types.REF);
此外,还应将第四个OUT参数注册为Oracle游标,因此请使用以下命令:

cst.registerOutParameter(4, OracleTypes.CURSOR);
因此,更新后的配置代码可能如下所示:

cst.setString(1,"A");
cst.setString(2, "B");
cst.setString(3,"C");
cst.registerOutParameter(4, OracleTypes.CURSOR);

如果您还没有
OracleTypes
所需的依赖项,请下载
ojdbc
Oracle JAR。根据您的Oracle版本,您可能需要一个稍有不同的链接(上面的链接是针对
12c
)。

根据我所读的内容,您不应该调用OUT参数的setter,因为它不是为了从外部接收任何输入值而设计的。因此,请删除此行:

cst.setNull(4, java.sql.Types.REF);
此外,还应将第四个OUT参数注册为Oracle游标,因此请使用以下命令:

cst.registerOutParameter(4, OracleTypes.CURSOR);
因此,更新后的配置代码可能如下所示:

cst.setString(1,"A");
cst.setString(2, "B");
cst.setString(3,"C");
cst.registerOutParameter(4, OracleTypes.CURSOR);

如果您还没有
OracleTypes
所需的依赖项,请下载
ojdbc
Oracle JAR。根据您的Oracle版本,您可能需要一个稍微不同的链接(上面的链接用于
12c
)。

您好,非常感谢您的回答,但是OracleTypes没有定义。我应该导入什么库?@user10888192您缺少一个Oracle JDBC JAR,请参阅我的更新答案。非常感谢,这为我解决了这个问题。我使用此说明添加OracleJDBCHello,非常感谢您的回答,但是OracleTypes没有定义。我应该导入什么库?@user10888192您缺少一个Oracle JDBC JAR,请参阅我的更新答案。非常感谢,这为我解决了这个问题。我使用此说明添加Oracle JDBC