

`java.sql.SQLSyntaxErrorException: ORA-01722:
数値が無効です。`のエラーが出ました。CSVファイルを読み込ませ、データベースに記入するシステムを作りたく、その途中で上記のエラーが出ました。

CSV書き込みのコントローラに

[code]

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
            CSVReader csvReading;
            String fileName;
            T001ItemDao itemDao;
            String nextPage = "";
    
            String name = request.getParameter("name");
            String code = request.getParameter("code");
            // //金額の取得
            String unitPrice = request.getParameter("unitPrice");
            // 数量の取得
            String count = request.getParameter("count");
            String isPR = request.getParameter("isPR");
            String img = request.getParameter("image");
            ServletContext con = getServletConfig().getServletContext();
    
            csvReading = new CSVReader();
            csvReading.csvAdd(request,con);
    
            List<List<String>> csvResult = csvReading.read();
    
    
                for(int i = 4; i < csvResult.size(); i++) {
                    if (null != csvResult.get(i)) {
                        for (int j = 0; j < csvResult.get(i).size(); j++) {
                            System.out.println("csvResult"+csvResult.get(i).get(j));
                            if (0 == (i % 4)){
    
                                try {
                                    itemDao = new T001ItemDao();
                                    int itembean = itemDao.update(code, name, unitPrice, count);
                                    request.setAttribute("itembean", itembean);
                                    nextPage = "/list.jsp";
                                } catch (ClassNotFoundException e) {
                                    // TODO 自動生成された catch ブロック
                                    e.printStackTrace();
                                } catch (SQLException e) {
                                    // TODO 自動生成された catch ブロック
                                    e.printStackTrace();
                                }
    
                            }else{
                                try {
                                    itemDao = new T001ItemDao();
                                    int result = itemDao.addItem(name, unitPrice, count,isPR,img);
                                    if (result == 1) {
                                        nextPage = "/list.jsp";
                                    } else {
                                        nextPage = "/add.jsp";
                                    }
                                } catch (ClassNotFoundException e) {
                                    // TODO 自動生成された catch ブロック
                                    e.printStackTrace();
                                } catch (SQLException e) {
                                    // TODO 自動生成された catch ブロック
                                    e.printStackTrace();
                                }
                            }
                        }
                    }
    
                }
    
            System.out.println("csvResult"+csvResult);
        }
    
[/code]

と書き、CSV書き込みのクラスに

[code]

    public List<List<String>> read() {
    
            // 返却用リスト箱作成
            List<List<String>> ret = new ArrayList<List<String>>();
            if (fileName != null) {
                System.out.println("fileName" + fileName);
                String inputCsvFile = "C:\\pleiades\\workspace\\hasuike\\jspServlet\\WebContent\\csv\\test1.csv";
                File csv = new File(inputCsvFile);
                System.out.println(csv);
    
                BufferedReader br = null;
    
                try {
                    int lineCount = 0;
                    // ファイルオープン
                     br = new BufferedReader(new FileReader(csv));
    
                    // num行読み込む（0の場合は全行）
                    String line = "";
                    int idx = 0;
                    while ((line = br.readLine()) != null) {
                        lineCount++;
    
                        // 1行を格納する箱作成
                        List<String> tmpList = new ArrayList<String>();
    
                        // 文字列index
                        int idxFrom = 0;
                        int idxTo = 0;
                        // 文字列長
                        while (true) {
    
                            // 最終項目を取得後は終了
                            if (idxFrom > line.length()) {
                                break;
                            }
    
                            // 次のセパレータ位置を取得
                            idxTo = line.indexOf(",", idxFrom);
    
                            // セパレータが発見できない場合は最終項目を取得
                            if (idxTo == -1) {
                                idxTo = line.length();
                            }
    
                            // 文字列取得
                            String word = line.substring(idxFrom, idxTo);
    
                            // 文字列を格納
                            tmpList.add(word);
    
                            // 検索開始位置を更新
                            idxFrom = idxTo + 1;
                        }
    
                        // 返却用リストに1行データを格納
                        ret.add(tmpList);
    
                        // numを超えたら読み込み終了。numが0のときは全量読む。
                        if (lineCount != 0 && idx > lineCount) {
    
                            break;
                        }
                    }
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    try {
                        if (br != null) {
                            br.close();
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return ret;
        }
    
[/code]

と書きました。エラーの内容を調べてみると型変換の失敗時に出るエラーであるとわかりました。  
とってきて `csvResult`に入れるリストが`[, スタバもか, 400, 40, 1], [518, green, 444, 35,
0]]`のように配列の最初の要素が空である場合があります。  
それにより、エラーが出たのかな、とはおもうのですが、直し方がわからず...  
（そもそもその部分ではないかもしれません）

どのように直せばよいのでしょうか？


CC BY-SA 3.0
2017-01-27T09:05:57.613
32200
2018-03-03T21:15:33.600
2018-03-03T21:15:33.600
4236
20417
question
java jsp servlet
java.sql.SQLSyntaxErrorException: ORA-01722: 数値が無効です。　のエラー


エラーが出ているならエラーログを貼り付けたほうがよいです。  
また、読み込んだデータ等も示せたほうがよいです。

"数値が無効"、"配列に空が存在する"であれば、空を読み込んだ際にString型の空文字となり、それをそのままデータベースに突っ込もうとして型変換エラーになっているのではないでしょうか。  
テーブル定義を確認してみてください。  
空以外の場合は暗黙の型変換でうまくいっているのでしょう。

どうやって直せば・・・については、ファイルを読み込んだときに空文字を変換するか、DBにINSERTするときに空文字を変換するか、くらいかと思います。  
前者であれば、`//
文字列取得`の後に空文字判定を入れるか、校舎であれば、for文のどこかなんでしょうがちょっと提示されているコードからは処理の全容がつかめないので具体的にはいえません。

ちなみに、"CSV書き込み"ってCSVファイルへのデータの書き出しという印象を受けますが、CSVファイルをDBへ書き込み、という意味ですよねきっと。


CC BY-SA 3.0
2017-02-21T08:34:15.633
32834
2017-02-21T08:34:15.633
20758
32200
answer


エラーメッセージを記載してください。

> java.sql.SQLSyntaxErrorException: ORA-01722: 数値が無効です

は、Oracleの文字型 → 数値型への内部的な型変換に失敗したときに発生します。  
型変換は、変換対象の文字列に、数値、小数点、符号以外の文字が含まれる場合に失敗します。


CC BY-SA 3.0
2017-02-22T02:09:13.247
32857
2017-02-22T02:09:13.247
20767
32200
answer