通过Java代码调用存储过程,获取错误PLS-00201:必须声明标识符

时间:2018-06-15 19:25:45

标签: java stored-procedures java-stored-procedures

我采用的是先前代码中构建的结果集,我可以看到该列表中的值在调试器中运行时正在拉动。当我尝试执行我的存储过程调用时,它失败并在callableStatement.execute();上发生以下错误:

PLS-00201:标识符' INFPL01.LWN_XML_PURCHASEORDER'必须申报 ORA-06550:第1行第7列: PL / SQL:忽略语句

这是我的代码:

public List<ProcedureResult> 
callLWN_XML_PURCHASEORDERProcedureAndSendMQMEssage(List<YmpohdroutDbo> list)
{
    DSConnection dsc = new DSConnection();

    Connection dbConnection = null;
    CallableStatement callableStatement = null;

    String LWN_XML_PURCHASEORDER_Sql = "{call "+PurchaseOrder.dbProperties.getProperty("Schema") +".LWN_XML_PURCHASEORDER(?,?,?,?,?,?,?)}";
    /*
     * stored procedure LWN_XML_PURCHASEORDER
     * 
     *  in_company IN NUMBER,
        in_PO_NUMBER IN VARCHAR2,
        in_po_release IN NUMBER,
        in_po_code IN VARCHAR2,
        in_object_TYPE IN VARCHAR2,
        RET_CODE OUT NUMBER,
        RET_MSG OUT CLOB)
    */

    List<ProcedureResult> result = new ArrayList<ProcedureResult>();

    try {
        dbConnection = dsc.getConnection();

        YmpohdroutDbo obj;
        ProcedureResult res;
        for(int i=0;i<list.size();i++)
        {
            obj = list.get(i);

            callableStatement = dbConnection.prepareCall(LWN_XML_PURCHASEORDER_Sql);

            // register input fields of stored procedure
            callableStatement.setInt(1, obj.getCompany());
            callableStatement.setString(2, obj.getPO_Number());
            callableStatement.setInt(3, obj.getPO_Release());
            callableStatement.setString(4, obj.getPO_Code());
            callableStatement.setString(5, (PurchaseOrder.projProperties.getProperty(Constants.SEC_KEY_COMMENT_TYPE))); 

            // register output fields of stored procedure 
            callableStatement.registerOutParameter(6, java.sql.Types.INTEGER);
            callableStatement.registerOutParameter(7, java.sql.Types.CLOB);

            // execute LWN_XML_PURCHASEORDER store procedure
            callableStatement.execute();

            res = new ProcedureResult();
            res.setCode(callableStatement.getInt(6));
            res.setMessage(callableStatement.getClob(7));

                // send response from stored procedure execution to MQMessages
                PurchaseOrder.writeClobMQMessage(res.getMessage());

                // mark record as processed by updating field INTERFACE_STS to P
                markRecordAsProcessed(obj, dsc);

                // Send procedures result as MQMessage before processing next record
                result.add(res);
        }   
    } catch (Exception e) {

        logger.error(e);
        System.exit(1);
    } finally {

        if (callableStatement != null) 
        {
            try
            {
                callableStatement.close();
            } 
            catch (SQLException e) 
            {
                logger.error(e);
            }
        }
        if (dbConnection != null) {
            DSConnection.close(dbConnection, null, callableStatement, null);
        }
    }
    return result;
}

我试着查看其他帖子,但看起来并不是同样的情况。我猜测我构建字符串的方式,但我所看到的所有例子都是以类似的方式进行的。谢谢!

0 个答案:

没有答案