質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

2893閲覧

javaでinsert文を用いるときのdate型の扱いについて

nagomi72

総合スコア51

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2018/09/08 02:39

insert文を実行するとき、java.sql.SQLSyntaxErrorException: ORA-00913: 値の個数が多すぎます。とのエラーが発生します。
調べたところ、カラムの数の不一致、またはデータ型の違いが原因となるようでした。

私のケースでは、テーブル(schedule)のカラム数は7つで、カラム名及びデータ型はid(number),userid(number),scheduledate(date),starttime(date),
endtime(date),schedule(varchar),scheudlememo(varchar)となっています。

insert文でも7つ分の値を用意しているため個数は一致していると考えていますが、
date型の3つのテーブルに対して、setStringでString型として値を置き換えているため
エラーが発生しているのでしょうか。

以下、ソースコードです。

入力フォーム

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <!--セレクトボックスを作っていく まずは年度から --> <div class="inputForm"> <form action="/databaseTest/AddTest" method="post"> <table> <tr> <td nowrap>日付</td> <td><select name="YEAR"> <% for (int i = 2018; i < 2022; i++) { %> <option value=<%=i%>><%=i%>年 <% } %> </select> <select name="MONTH"> <% for (int j = 1; j < 13; j++) { %> <option value=<%=j%>><%=j%>月 <% } %> </select> <select name="DAY"> <% for (int k = 1; k < 32; k++) { %> <option value=<%=k%>><%=k%>日 <% } %> </select></td> </tr> <tr> <td nowrap>時刻</td> <td><select name="SHOUR"> <% for (int i = 0; i < 24; i++) { %> <option value=<%=i%>><%=i%>時 <% } %> </select> <select name="SMINUTE"> <option value="0">00分 <option value="30">30分 </select> ~ <select name="EHOUR"> <% for (int i = 0; i < 24; i++) { %> <option value=<%=i%>><%=i%>時 <% } %> </select> <select name="EMINUTE"> <option value="">--分 <option value="0">00分 <option value="30">30分 </select></td> </tr> <tr> <td nowrap>予定</td> <td><input type="text" name="PLAN" value="" size="30" maxlength="100"></td> </tr> <tr> <td valign="top" nowrap>メモ</td> <td><textarea name="MEMO" cols="30" rows="10" wrap="virtual"></textarea></td> </tr> </table> <p> <input type="submit" value="登録する"> <input type="reset" value="入力し直す"> <p> </form> </div> </body> </html>

パラメータを使用しinsert分を実行

package databaseTest; import java.io.IOException; import java.sql.Connection; import java.sql.Date; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Locale; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/AddTest") public class AddTest extends HttpServlet { private static final long serialVersionUID = 1L; public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // パラメータ取得 String year = request.getParameter("YEAR"); String month = request.getParameter("MONTH"); String day = request.getParameter("DAY"); String shour = request.getParameter("SHOUR"); String sminute = request.getParameter("SUMINUTE"); String ehour = request.getParameter("EHOUR"); String eminute = request.getParameter("EMINUTE"); String plan = request.getParameter("PLAN"); String memo = request.getParameter("MEMO"); // 0埋め month = String.format("%02d", Integer.parseInt(month)); day = String.format("%02d", Integer.parseInt(day)); shour = String.format("%02d", Integer.parseInt(shour)); sminute = String.format("%02d", Integer.parseInt(shour)); ehour = String.format("%02d", Integer.parseInt(ehour)); eminute = String.format("%02d", Integer.parseInt(eminute)); // insert文のwhere旬に代入する値を準備 // sql実行のためにフォーマットを整る String date_format = "'" + year + "-" + month + "-" + day; String date_query = date_format + " 00:00:00'"; String start_time_query = date_format + " " + shour + ":" + sminute + ":00'"; String end_time_query = date_format + " " + ehour + ":" + eminute + ":00'"; // 日付が指定されていない場合開始時間及び終了時間をnullで登録 if (shour.equals("") || sminute.equals("") || eminute.equals("") || ehour.equals("")) { start_time_query = null; end_time_query = null; } response.setContentType("text/html; charset=UTF-8"); Connection conn = null; try { // JDBCドライバを読み込み Class.forName("oracle.jdbc.driver.OracleDriver"); // データベースへ接続 conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.132:1521:xe", "stockuser", "moriara0029"); // insert文を準備 String sql = "insert into schedule (userid, scheduledate, starttime, endtime, schedule, schedulememo) values (?, ?, ?, ?, ?, ?,?)"; PreparedStatement pstmt = conn.prepareStatement(sql); // where旬に置き換えていく pstmt.setInt(1, 1); pstmt.setInt(2, 2); pstmt.setString(3, date_query); pstmt.setString(4, start_time_query); pstmt.setString(5, end_time_query); pstmt.setString(6, plan); pstmt.setString(7, memo); // 実行 int num = pstmt.executeUpdate(); pstmt.close(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { try { if (conn != null) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } } }

ご教授の程よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

個数あってるとかいきっときながらカラムのidが抜けていました。

投稿2018/09/08 02:48

nagomi72

総合スコア51

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問