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

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

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

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

Java

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

SQL

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

Q&A

解決済

2回答

8397閲覧

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

nagomi72

総合スコア51

Oracle

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

Java

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

SQL

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

0グッド

0クリップ

投稿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>

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

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

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

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

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

guest

回答2

0

ベストアンサー

チョットOracle環境が今ないのでわからないんですが。
dateの所で

'2018-09-10 00:00:00'

TO_DATE('2018-09-10 00:00:00','YYYY-MM-DD HH24:MI:SS')

にしないと行けないとか
(SQLServerなら上の書式を自動変換してたと思いますが)
後処理効率効率を考えてパラメータクエリーを使うべきですね-

投稿2018/09/08 07:23

tonkun4os

総合スコア321

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

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

nagomi72

2018/09/08 08:00

ご回答ありがとうございます。 to_dateで動作確認ができました。 パラメータクエリの方が可読性も高いですよね… ありがとうございました。
guest

0

次回から質問にCREATE TABLE文も載せてください。

SQL

1insert into schedule (id,userid, scheduledate, starttime, endtime, schedule, schedulememo) values ( 1,2,to_date('2018-09-10 00:00:00','yyyy-mm-dd hh24:mi:ss'),to_date('2018-09-10 00:00:00','yyyy-mm-dd hh24:mi:ss'),to_date('2018-09-10 01:00:00','yyyy-mm-dd hh24:mi:ss'),'fd','d')

投稿2018/09/08 07:20

Orlofsky

総合スコア16415

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

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

nagomi72

2018/09/08 08:01

以後気をつけます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問