1

準備されたステートメントを実行すると、ORA-01858: a non-numeric character was found where a numeric was expected. いくつかのフォーラムを検索すると、日付データ型が原因であるとのことです。私の準備されたステートメントは

insert  into OPRS_ZONES(
  ZONE_ID,
  ZONE_CODE,
  ZONE_NAME,
  PLACE_ID,
  CORP_ID,
  CREATED_BY,
  CREATED_DATE,
  MODIFIED_BY,
  MODIFIED_DATE) 
values(?,?,?,?,?,?,?,?,?)

私が挿入しようとしている値は

03.0, 
'FLORIDA', 
'FLORIDA', 
05231.0, 
01.0, 
01.0, 
TO_DATE('19102012130639','DDMMYYYYHH24MISS'), 
NULL, 
NULL

テーブル定義

CREATE TABLE OPRS_ZONES ( 
  ZONE_ID NUMERIC(20,0) , 
  ZONE_CODE VARCHAR2(16) , 
  ZONE_NAME VARCHAR2(255) , 
  PLACE_ID NUMERIC(20,0) , 
  CORP_ID NUMERIC(20,0) , 
  CREATED_BY NUMERIC(20,0) , 
  CREATED_DATE DATE , 
  MODIFIED_BY NUMERIC(20,0) , 
  MODIFIED_DATE DATE );

準備されたステートメントの値を入力しているコード、

public int executePreparedStatement(String query, List myCollection, int colLength, String tableName) throws DBException,SQLException {

        int rowsAffected    = 0; 
        int [] noOfRowsExecuted = null;
        try{
            conn.setAutoCommit(false);
            if(query != null){  
                ps = conn.prepareStatement(query);
                for (int i = 0; i < myCollection.size(); i++) {
                    logger.info("@@mycollcetion -- "+myCollection.get(i));
                    List list = (List) myCollection.get(i);
                    int count = 1;
                    for (int j = 0; j < list.size(); j++) {
                        ps.setObject(count, list.get(j));
                        count++;
                    }
                    ps.execute();
                    logger.info("@@ noOfRowsExecuted == "+noOfRowsExecuted);
                }
            }
        }catch(Exception e){
            logger.error("Error in the execution of Prepared Statement: \n" + query + "\nData : " + listData, e);
            rowsAffected    = Utility.getErrorCode(e);
            throw new DBException(e);
        }finally{ 
            try {
                if (ps != null) {
                    ps.close();
                    ps = null;
                }
            } catch (Exception e) {
            }
            rowsAffected    = 0; 
            noOfRowsExecuted = null;
        }
        return rowsAffected;        
    }

にはlist myCollectionが含まれていvaluesます。queryこのプリペアド ステートメントは、SQLDEVELOPERprepared statement では正常に機能しますが、Java プログラムを実行するとエラーが発生します。これは本当に日付形式の問題ですか? もしそうなら、なぜ SQLDEVELOPER で正常に動作するのですか?

助けてください、

ありがとう

4

2 に答える 2

3

次の準備済みステートメントを変更します。

insert  into OPRS_ZONES(
  ZONE_ID,
  ZONE_CODE,
  ZONE_NAME,
  PLACE_ID,
  CORP_ID,
  CREATED_BY,
  CREATED_DATE,
  MODIFIED_BY,
  MODIFIED_DATE) 
values(?,?,?,?,?,?,
       TO_DATE(?,'DDMMYYYYHH24MISS'),
       ?,?)

そして、実際の CREATED_DATE のみを文字列として設定します。つまり、コレクション オブジェクトのゲッターが TO_DATE 構文全体ではなく、"19102012130639" を返すようにします。

編集:すべての値を含む文字列配列があり、編集済みのステートメント バージョンを使用すると仮定すると、これは機能するはずです。

   String[] values = { "03.0", "FLORIDA", "FLORIDA", "05231.0", "01.0", "01.0",   "19102012130639", null, null };
   ps = conn.prepareStatement(query);
   int i = 1;
   foreach(String par : values) {
      ps.setObject(i, par);
      i++;
   }
   ps.execute();
于 2012-10-22T07:59:31.910 に答える