1

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

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

java.sql.SQLException: Invalid argument(s) in call: Use setNull(int parameterIndex, int sqlType, String typeName) for user-defined types and REF types

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;          
4

1 回答 1

0

根据我的阅读,您不应该在 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请访问此处并下载ojdbcOracle JAR。根据您的 Oracle 版本,您可能需要稍有不同的链接(以上链接适用于12c)。

于 2019-02-13T06:44:00.087 回答