Java org.postgresql.util.psqleexception:偏移量1处的函数或过程转义语法格式错误

Java org.postgresql.util.psqleexception:偏移量1处的函数或过程转义语法格式错误,java,postgresql,jdbc,Java,Postgresql,Jdbc,目前,我面临通过DAO类中的JDBC获取postgresql函数数据的问题。连接正在正确建立 CallableStatement mngStatement = conn .prepareCall("{? = CALL SELECT_SEARCH_DETAILS(?,?,?,?,?,?,?,?)}"); mngStatement.registerOutParameter(1, Types.VARCHAR); mngState

目前,我面临通过DAO类中的JDBC获取postgresql函数数据的问题。连接正在正确建立

CallableStatement  mngStatement = conn              
                     .prepareCall("{? = CALL SELECT_SEARCH_DETAILS(?,?,?,?,?,?,?,?)}");

mngStatement.registerOutParameter(1, Types.VARCHAR);
mngStatement.setString(2,abc.getContractNumber());
mngStatement.setString(3,abc.getOrderNumber());
mngStatement.setString(4,abc.getShipmentNumber());
mngStatement.setString(5,abc.getShipmentControlNo());
mngStatement.setString(6,abc.getStatusFromDate());
mngStatement.setString(7,abc.getStatusToDate());
mngStatement.setString(8,abc.getSourceSystem());
mngStatement.setString(9,abc.getDestinationSystem());

mngStatement.execute();
rs  = (ResultSet) mngStatement.getObject(1);
获取错误,如:

org.postgresql.util.PSQLException:函数或过程格式错误 偏移量1处的转义语法

请帮我提一下你的建议。提前谢谢

功能:

FUNCTION SELECT_SEARCH_DETAILS(
    IN P_CONTARCT_NUM character varying,
    IN P_ORDER_NUM character varying,
    IN P_SHIPMENT_NUM  character varying,
    IN P_SHIP_CON_NUM  character varying,
    IN P_FROM_DATE  character varying,
    IN P_TO_DATE  character varying,
    IN P_SOURCE_SYSTEM character varying,
    IN P_DESTINATION_SYSTEM character varying)
  RETURNS table(CONTRACT_NUMBER text,ORDER_NUMBER text, SHIPMENT_NUMBER text, SCN text, STATUS_CODE text,STATUS_DATE text, LAST_UPDATE_DATE text, SOURCE_SYSTEM text, DESTINATION_SYSTEM text, RFID_FOLLOW_ON_CODE text, UID_INDICATOR text, IVC_SHIPMENT_SEQ_ID text) AS
$BODY$

您不需要
CallableStatement

使用常规的
PreparedStatement
select
语句

当函数返回一个表(“集合”)时,您需要使用:

select * from SELECT_SEARCH_DETAILS(...);
因此,完整代码如下所示:

PreparedStatement pstmt = conn.prepareStatement("select * from SELECT_SEARCH_DETAILS(?,?,?,?,?,?,?,?)");

pstmt.setString(1, abc.getContractNumber());
pstmt.setString(2, abc.getOrderNumber());
pstmt.setString(3, abc.getShipmentNumber());
pstmt.setString(4, abc.getShipmentControlNo());
pstmt.setString(5, abc.getStatusFromDate());
pstmt.setString(6, abc.getStatusToDate());
pstmt.setString(7, abc.getSourceSystem());
pstmt.setString(8, abc.getDestinationSystem());

ResultSet rs = pstmt.executeQuery();

您不需要
CallableStatement

使用常规的
PreparedStatement
select
语句

当函数返回一个表(“集合”)时,您需要使用:

select * from SELECT_SEARCH_DETAILS(...);
因此,完整代码如下所示:

PreparedStatement pstmt = conn.prepareStatement("select * from SELECT_SEARCH_DETAILS(?,?,?,?,?,?,?,?)");

pstmt.setString(1, abc.getContractNumber());
pstmt.setString(2, abc.getOrderNumber());
pstmt.setString(3, abc.getShipmentNumber());
pstmt.setString(4, abc.getShipmentControlNo());
pstmt.setString(5, abc.getStatusFromDate());
pstmt.setString(6, abc.getStatusToDate());
pstmt.setString(7, abc.getSourceSystem());
pstmt.setString(8, abc.getDestinationSystem());

ResultSet rs = pstmt.executeQuery();

您的存储过程是什么样子的?嗨,berger,我已经更新了问题中的函数体。正如有人在评论中建议的那样,您可以尝试使用小写的
调用吗?
?小写的“调用”仍然会出现相同的错误。现在我遇到如下错误:“org.postgresql.util.psqleException:执行CallableStatement时参数数量无效“。但我没有发现任何不匹配。您的存储过程是什么样子的?嗨,伯杰,我已经更新了问题中的函数体。正如有人在评论中建议的那样,您可以尝试使用小写的
调用
?小写的“调用”仍然会出现相同的错误。现在我遇到如下错误:“org.postgresql.util.psqleException:执行CallableStatement时使用的参数数无效”。但我在这里没有发现任何不匹配。