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

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

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

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Java

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

SQL

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

解決済

Javaでのinsert文実行時のリテラルが書式文字列と一致しませんとのエラーについて

nagomi72
nagomi72

総合スコア51

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Java

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

SQL

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

2回答

0評価

0クリップ

6460閲覧

投稿2018/09/08 05:30

編集2018/09/08 05:38

Javaを使って、入力フォームで入力されたパラメータを使ってinsert文を実行したいのですが標題にある
リテラルが書式文字列と一致しませんとのエラーがでます。

使用しているデータベースはorcleです。

String型の変数sqlに実行するinsert文を格納しており、sqlを実行する前に
コンソールでsqlの値を出力したところ、

insert into schedule (id,userid, scheduledate, starttime, endtime, schedule, schedulememo) values ( 1,2,'2018-09-10 00:00:00','2018-09-10 00:00:00','2018-09-10 01:00:00','fd','d')

と出力されました。

insert文の対象となるscheduleテーブルのカラム数は7つで、カラム名及びデータ型は

id(number),userid(number),scheduledate(date),starttime(date),
endtime(date),schedule(varchar),scheudlememo(varchar)となっています。

このinsert文をosqledit上で実行したところ問題なく成功し、テーブルに値が挿入されました。

Javaのプログラム上で成功しない理由を知りたく存じます。

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

insert文を実行する処理

package servlet; import java.io.IOException; import java.sql.Connection; import java.sql.Date; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import javax.xml.crypto.Data; import model.*; import org.eclipse.jdt.internal.compiler.ast.ArrayAllocationExpression; import org.omg.CosNaming.NamingContextExtPackage.StringNameHelper; @WebServlet("/AddSchedule") public class AddSchedule extends HttpServlet { private static final long serialVersionUID = 1L; public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { String year; String month; String day; String shour; String sminute; String ehour; String eminute; String plan; String memo; String parameter; // parameterCHeckを呼び出したいがためだけにmonthインスタンスを生成.よき方法求む Month m = new Month(); // パラメータが不正な値じゃないかチェック×2 parameter = request.getParameter("YEAR"); System.out.println("年は" + parameter); year = m.stringParameterCheck(parameter); parameter = request.getParameter("MONTH"); System.out.println("月は" + parameter); month = m.stringParameterCheck(parameter); parameter = request.getParameter("DAY"); System.out.println("日は" + parameter); day = m.stringParameterCheck(parameter); parameter = request.getParameter("SHOUR"); System.out.println("shourは" + parameter); shour = m.stringParameterCheck(parameter); parameter = request.getParameter("SMINUTE"); System.out.println("sminuteは" + parameter); sminute = m.stringParameterCheck(parameter); parameter = request.getParameter("EHOUR"); System.out.println("ehourは" + parameter); ehour = m.stringParameterCheck(parameter); parameter = request.getParameter("EMINUTE"); System.out.println("eminuteは" + parameter); eminute = m.stringParameterCheck(parameter); parameter = request.getParameter("PLAN"); System.out.println("planは" + parameter); plan = m.stringParameterCheck(parameter); parameter = request.getParameter("MEMO"); System.out.println("memoは" + parameter); memo = m.stringParameterCheck(parameter); // 日付が不正な値な時、パラメータ無しでCalendar.jspにリダイレクト if (year.equals("") || month.equals("") || day.equals("")) { response.sendRedirect("/CalendarJsp/Calendar.jsp"); } // 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("")) { System.out.println("日付おかしいぞぉ"); start_time_query = null; end_time_query = null; } System.out.println("おかしいといわれてる月の値は" + date_query); System.out.println("おかしいといわれているはじまりの時間の値は" + start_time_query); System.out.println("おかしいといわれているおわりの時間の値は" + end_time_query); 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 (id,userid, scheduledate, starttime, endtime, schedule, schedulememo) values ( 1,2," + date_query + "," + start_time_query + "," + end_time_query + "," + "'" + plan + "'," + "'" +memo + "')"; System.out.println("実行するsqlはこれだ!" + sql); PreparedStatement pstmt = conn.prepareStatement(sql); // 実行 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(); } } //ただmonthから1ひきたかっただけなんだ… int month_numeric_value = Integer.parseInt(month) - 1; StringBuffer sb = new StringBuffer(); sb.append("/CalendarJsp/Calendar.jsp"); sb.append("?YEAR="); sb.append(year); sb.append("&MONTH="); sb.append(month_numeric_value); response.sendRedirect(new String(sb)); } }

入力フォームであるjsp

<%@page import="java.util.Calendar"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="model.Month"%> <html> <head> <meta charset=UTF-8"> <title>カレンダーの表示</title> </head> <body> <% Month month = new Month(); // パラメータ確認。値がない、不正な場合-999をセット String year_parameter = request.getParameter("YEAR"); String month_parameter = request.getParameter("MONTH"); int year_now = month.intParameterCheck(year_parameter); int month_now = month.intParameterCheck(month_parameter); if (year_now == -999 || month_now == -999) { //現在の年、月をセット year_now = month.cal.get(Calendar.YEAR); month_now = month.cal.get(Calendar.MONTH) + 1; } //12月の次は1月かつ次年度 if (month_now > 12) { month_now = 1; year_now++; } //逆もまた然り if (month_now < 1) { month_now = 12; year_now--; } int date_now = month.cal.get(Calendar.DATE); //monthインスタンスになんとなく現在の日時をセット month.cal.set(Calendar.YEAR, year_now); month.cal.set(Calendar.MONTH, month_now - 1); month.cal.set(Calendar.DATE, 1); %> <a href="/CalendarJsp/Calendar.jsp?YEAR=<%=year_now%>&MONTH=<%=month_now + 1%>">翌月</a>&nbsp;<%=year_now%>年<%=month_now%>月&nbsp; <a href="/CalendarJsp/Calendar.jsp?YEAR=<%=year_now%>&MONTH=<%=month_now - 1%>">前月</a> <table border="1"> <tr> <th>日</th> <th>月</th> <th>火</th> <th>水</th> <th>木</th> <th>金</th> <th>土</th> </tr> <!-- その月の最終日 --> <% int max_day = month.cal.getActualMaximum(Calendar.DAY_OF_MONTH); %> <!--1日の曜日 --> <% int start_index = month.cal.get(Calendar.DAY_OF_WEEK); %> <tr> <!-- 1週目の1日までを空白で埋める --> <% for (int i = 1; i < start_index; i++) { %> <td>&nbsp;</td> <% } //当月の最終日まで日付けを入れていく for (int i = 1; i <= max_day; i++) { %> <td><a href="/CalendarJsp/scheduleDetail.jsp?YEAR=<%=year_now%>&MONTH=<%=month_now%>&DAY=<%=i%>"><%=i%></a></td> <% month.cal.set(Calendar.DATE, i); %> <!-- 土曜日なら次の列へ --> <% if (Calendar.SATURDAY == month.cal.get(Calendar.DAY_OF_WEEK)) { %> </tr> <% } %> <% } %> <!-- 当月の最終日が土曜日じゃない時、土曜日まで余白を埋める --> <% System.out.println("日付最終日までのループが終わった時点での年は" + month.cal.get(month.cal.YEAR)); System.out.println("月は" + month.cal.get(month.cal.MONTH)); System.out.println("問題の日は" + month.cal.get(month.cal.DATE)); System.out.println("曜日は" + month.cal.get(month.cal.DAY_OF_WEEK)); if (month.cal.get(month.cal.DAY_OF_WEEK) < 7) { System.out.println("ちっちぇぞぉ"); %> <td> <% for (int count = month.cal.get(month.cal.DAY_OF_WEEK); count < 6; count++) { System.out.println("空白をいれるよん"); %> <td>&nbsp;</td> <% } %> </td> <% } %> </table> </form> </body> </html>

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Java

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

SQL

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