java.sql.SQLException:调用中无效的参数:将setNull用于用户定义的类型和REF类型

时间:2019-02-13 06:36:00

标签: java plsql

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

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

java.sql.SQLException:调用中无效的参数:将setNull(int parameterIndex,int sqlType,String typeName)用于用户定义的类型和REF类型

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;          

1 个答案:

答案 0 :(得分:0)

从我所读的内容中,您不应在OUT参数上调用设置方法,因为它并非旨在从外部接收任何输入值。因此,删除此行:

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所需的依赖项,请visit here并下载ojdbc Oracle JAR。根据您的Oracle版本,您可能需要一个稍微不同的链接(以上链接适用于12c)。