【问题标题】:Java stored procedure: java.lang.NoSuchMethodErrorJava 存储过程:java.lang.NoSuchMethodError
【发布时间】:2014-10-15 12:32:55
【问题描述】:

我正在尝试执行从 DB2 存储过程触发的 Java 存储过程,但是出现错误。

我的 DB2 存储过程:

CREATE PROCEDURE SP_INSERT_UPDATE_REPNUMHD (
    IN RECNUM             INTEGER, 
    IN REPNUMHD_ID        INTEGER,   
    IN BINNEN_DATUM       DATE,
    IN BINNEN_INI         VARCHAR(2),
    IN REP_STATUS         SMALLINT,
    IN BEVESTIGD          CHAR(1),
    IN BEVESTIGD_DATUM    DATE,
    IN BEVESTIGD_INI      VARCHAR(2),
    IN KLANT_REF          VARCHAR(20),
    IN ACTION             CHAR(1)
)
SPECIFIC SP_INSERT_UPDATE_REPNUMHD
DYNAMIC RESULT SETS 0
DETERMINISTIC
LANGUAGE JAVA
PARAMETER STYLE JAVA
NO DBINFO
NOT FENCED
THREADSAFEre
MODIFIES SQL DATA
PROGRAM TYPE SUB
EXTERNAL NAME 'RepairMigration!insertRepairHeader'

我的java存储过程如下:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.Date;
import java.util.Properties;
import java.util.logging.Logger;
import java.util.logging.FileHandler;
import java.io.InputStream;
import java.io.FileInputStream;
import java.io.IOException;

public class RepairMigration {

    private static final Properties config = new Properties();
    private static final Logger log = Logger.getLogger( RepairMigration.class.getName() );

    /**
     * Inserts a record from table REPNUMHD (DB2) to repair_repair (Postgres) 
     * <p>
     *
     * @param  db2RecNum        RECNUM,
     * @param  repairId         REPNUMHD_ID,
     * @param  receivedDate     BINNEN_DATUM,
     * @param  receivedIni      BINNEN_INI,
     * @param  repairStatusId   REP_STATUS,
     * @param  confirmed        BEVESTIGD,
     * @param  confirmedDate    BEVESTIGD_DATUM,
     * @param  confirmedIni     BEVESTIGD_INI,
     * @param  customerRef      KLANT_REF,
     * @param  customerId       KLANTNUMMER,
     * @param  action           ACTION,
     */
    public static void insertRepairHeader(
        int db2RecNum,
        int repairNumber,
        Date receivedDate,
        String receivedIni,
        int repairStatusId,
        String confirmed,
        Date confirmedDate,
        String confirmedIni,
        String customerRef,
        int customerId,
        String action
    ) throws Exception {
        String query = "";
        PreparedStatement pstmt = null;
        Connection con = RepairMigration.connect();
        if (action == "I")
        {
            query = "INSERT INTO repair_repair("+
                    " status_id, " +
                    " customer_id, " +
                    " contact_id, " +
                    " repair_number, " +
                    " received_date, " +
                    " received_uid, " +
                    " received_initials, " +
                    " confirmed, " +
                    " confirmed_date, " +
                    " confirmed_uid, " +
                    " confirmed_initials, " +
                    " customer_reference, " +
                    " db2_recnum) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?)";
            pstmt = con.prepareStatement(query);
            pstmt.setInt(1, getStatusId(repairStatusId, con)); 
            pstmt.setInt(2, getCustomerId(customerId, con)); 
            pstmt.setNull(3, java.sql.Types.INTEGER);
            pstmt.setInt(4, repairNumber);
            pstmt.setDate(5, receivedDate);
            pstmt.setNull(6, java.sql.Types.INTEGER);
            pstmt.setString(7, receivedIni);
            pstmt.setBoolean(8, confirmed == "1" ? true : false);
            pstmt.setDate(9, confirmedDate);
            pstmt.setNull(10, java.sql.Types.INTEGER);
            pstmt.setString(11, confirmedIni);
            pstmt.setString(12, customerRef);
            pstmt.setInt(13, db2RecNum);
            pstmt.executeUpdate();
        }
        else{ // action = "U"
            query = "UPDATE repair_repair "+
                    " SET received_date = ?, " +
                    " received_initials = ?, " +
                    " status_id = ?, " +
                    " confirmed = ?, " +
                    " confirmed_date = ?, " +
                    " confirmed_initials = ?, " +
                    " customer_reference = ? " +
                    " WHERE db2_recnum = ?";
            pstmt = con.prepareStatement(query);
            pstmt.setDate(1, receivedDate);
            pstmt.setString(2, receivedIni);
            pstmt.setInt(3, getStatusId(repairStatusId, con));
            pstmt.setBoolean(4, confirmed == "1" ? true : false);
            pstmt.setDate(5, confirmedDate);
            pstmt.setString(6, confirmedIni);
            pstmt.setString(7, customerRef);
            pstmt.setInt(8, db2RecNum);
            pstmt.executeUpdate();
        }
    }
}

检查 db2diag.log

2014-10-13-14.17.37.654542+120 I2604998158E538     LEVEL: Warning
PID     : 18214                TID  : 139965772773120PROC : db2fmp (
INSTANCE: db2inst1             NODE : 000
FUNCTION: DB2 UDB, BSU Java support, sqlejLogException, probe:10
MESSAGE : java.lang.NoSuchMethodError: RepairMigration.insertRepairHeader(IILjava/sql/Date;Ljava/lang/String;SLjava/lang/String;Ljava/sql/Date;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
DATA #1 : Hexdump, 4 bytes
0x00007F4C522A9B30 : 0000 0000 

根据错误信息,似乎我的整数参数不见了。那是问题吗?如果是这样,我该如何解决?

提前致谢!

【问题讨论】:

    标签: java sql stored-procedures db2


    【解决方案1】:

    根据错误信息,似乎我的整数参数不见了。是这个问题吗?

    不完全是。这个签名的含义

    RepairMigration.insertRepairHeader(IILjava/sql/Date;Ljava/lang/String;
                                       SLjava/lang/String;Ljava/sql/Date;
                                       Ljava/lang/String;Ljava/lang/String;
                                       Ljava/lang/String;)V
    

    是:

    void RepairMigration.insertRepairHeader(int, int, java.sql.Date, String,
                                       short, String, java.sql.Date,
                                       String, String, String)
    

    与您的代码相比,repairStatusId 的类型似乎发生了变化,并且缺少customerId 参数。

    基本上,问题在于存储过程类和CREATE STORED PROCEDURE ...语句中的参数类型不匹配。比较它们。 SQL和java代码甚至参数的个数都不一样。

    【讨论】:

      猜你喜欢
      • 2012-07-12
      • 1970-01-01
      • 2011-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-03
      相关资源
      最近更新 更多