我正在尝试使用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;
答案 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
)。