2017-01-05 2 views
0

Nous avons récemment basculé sur l'utilisation postgresql (EnterpriseDB), et je me suis déplacé sur une fonction, mais quand je le lance je reçois:Erreur lors de l'exécution de la fonction postgresql java

com.edb.util.PSQLException: ERROR: bind message has 2 result formats but query has 1 columns 

La fonction est:

CREATE OR REPLACE FUNCTION receive_item(qtyexpected integer, qtyrcvd integer, reasoncd character varying, commenttext character varying, whs character varying, rcvrnbr character varying, ponbr character varying, itemid character varying) RETURNS integer AS 
$BODY$ 
    rcvrDtlId integer; 
begin 
    rcvrDtlId := 0; 

    begin 
    update rcvr_dtl set 
    qty_expected = qtyExpected, qty_received = qty_received + qtyRcvd, reason_cd = reasonCd, comments = commentText 
    where warehouse = whs and rcvr_nbr = rcvrNbr and po_nbr = poNbr and item_nbr = itemId 
    returning rcvr_dtl_id into rcvrDtlId;        
    exception 
    when no_data_found then 
     null; 
    end;        

    return rcvrDtlId; 
end$BODY$ 
LANGUAGE edbspl VOLATILE NOT LEAKPROOF 
COST 100; 

Et il est appelé avec:

sql= "{? = CALL receive_item(?,?,?,?,?,?,?,?)}"; 
m_ReceiveItem = m_Conn.prepareCall(sql); 
m_ReceiveItem.registerOutParameter(1, Types.INTEGER); 
m_ReceiveItem.setInt(2, msg.getQtyExpected()); 
m_ReceiveItem.setInt(3, msg.getQtyReceived()); 
m_ReceiveItem.setString(4, msg.getReasonCode()); 
m_ReceiveItem.setString(5, msg.getComments()); 
m_ReceiveItem.setString(6, msg.getFacilityNbr()); 
m_ReceiveItem.setString(7, msg.getRcvrNbr()); 
m_ReceiveItem.setString(8, msg.getPoNbr()); 
m_ReceiveItem.setString(9, msg.getSku()); 
m_ReceiveItem.execute(); 
rcvrDtlId = m_ReceiveItem.getInt(1); 

Je ne peux pas semble trouver des informations sur cette erreur qui se rapporte de quelque manière que. Pourquoi cette erreur se produirait-elle pour le code ci-dessus?

+0

En fait, l'erreur semble être spécifique au pilote de EDB (cette chaîne n'existe pas dans la source des pilotes postgres normal java). Si vous échangez le pilote edb pour le pilote JDBC de vanilla postgres, cela fonctionne-t-il? EnterpriseDB ne libère pas leur source Je ne pense pas pour le pilote, si difficile d'avoir un coup d'oeil pour voir ce qui se passe. –

Répondre

1

j'ai pu résoudre ce problème en changeant la syntaxe de la syntaxe ? = call... à select * from receive_item...

+0

PostgreSQL ne fait pas la distinction entre les PROCÉDURES STOCKÉES et les FONCTIONS DÉFINIES PAR L'UTILISATEUR. Ils sont tous considérés comme identiques, et ils sont tous accessibles via SELECT. – joanolo