Oracle Database のエラーが分かり辛い...ORA-00904: "USERS0_"."INSERTUSER": 無効な識別子です。

f:id:ts0818:20200711104225j:plain

ポイント還元終了しましたね、え?何のって?

www.itmedia.co.jp

 2019年10月の消費税増税に合わせて始まった、キャッシュレス決済時の政府のポイント還元制度が6月30日で終了した。

キャッシュレス決済のポイント還元終了 中小店舗に反動減や手数料負担懸念の声も (1/2) - ITmedia NEWS

⇧ キャッシュレス決済でしょうが~!

ちなみに、キャッシュレスって、

キャッシュレス社会cashless society)は、紙幣硬貨を使用せず、クレジットカード電子マネーを利用した電子決済が広く普及した社会。

キャッシュレス社会 - Wikipedia

⇧ お金という概念が無くなるわけではないんですよね。

経済産業省の「キャッシュレスの現状及び意義」って資料(2020年1月)によると、

  • 日本のキャッシュレス決済比率は約20%にとどまっているが、主要各国では40%~60%台。
  • キャッシュレス決済比率を2025年までに4割程度、将来的には世界最高水準の80%を目指す。

https://www.meti.go.jp/policy/mono_info_service/cashless/image_pdf_movie/about_cashless.pdf

⇧ ってな感じで、あと5年で60%増を狙ってるらしいんだけど、そんな上手くいくもんかね?

資料の最後は、

現金決済インフラを維持するために、年間約1.6兆円を超える直接コストが発生している。

https://www.meti.go.jp/policy/mono_info_service/cashless/image_pdf_movie/about_cashless.pdf

⇧ って締めくくってるけど、このうち、どれだけ削減できるのかって話にはまったく触れていないというね...

コストがかかってるのは分かるんだが、そこからどれだけの費用対効果になるのかまで提示しないと意味ないと思うんだけど、お役所仕事だから許されるのかね?

 

で、実際にキャッシュレス社会になってきているのか?

経済産業省の調査によると、

www.meti.go.jp

経済産業省がアンケートした結果が、以下になるらしいんだけど、

https://cashless.go.jp/assets/doc/200630_questionnaire_report.pdf

上記の資料でも、「加盟店」側では「手数料」が割高で「キャッシュレス化」の「端末」の導入を続けるのが難しいって話が出てますと。

 

民間の情報でも、

the-owner.jp

⇧ う~ん、泥船化してきてる感が否めない...

だがしかし、

maonline.jp

ただ、手数料の引き上げはスマホ決済終了の「決め手」ではなさそう。丸亀製麺ではSuicaやiDといった非接触ICカードによる決済サービスを継続しているからだ。こうした非接触ICカードによる決済サービスの手数料は、値上げ後のスマホ決済手数料よりも割高なケースが多い。手数料の値上げを懸念するのなら、真っ先に非接触ICカード決済が切られるはずだ。

利用者も加盟店も?じわじわと広がる「スマホ決済離れ」の予兆(2ページ目) - M&A Online

⇧ 「手数料」だけの話でもなく、

「スキャン支払い」は中小・零細事業者囲い込みのために導入された仕組みだが、(1)顧客がスマホを取り出す(2)決済アプリを開く(3)店舗の専用QRコードをスキャンする(4)金額を入力する(5)店舗スタッフが金額を確認(6)決済ボタンを押すと、最低でも6つの手順を踏む必要がある。ランチタイムにレジが混雑する外食や夕方に買い物客が増えるスーパーなどでは、かえって現金決済よりも時間がかかるケースもある。

利用者も加盟店も?じわじわと広がる「スマホ決済離れ」の予兆(2ページ目) - M&A Online

一方、非接触ICカード決済は、(1)顧客がスマホを取り出す(2)店舗のICリーダーにかざすの2ステップで済む。レジの混雑を避けたい事業者がスマホ決済からいち早く撤退したのにも、スマホ決済の煩わしさという理由がありそうだ。

利用者も加盟店も?じわじわと広がる「スマホ決済離れ」の予兆(2ページ目) - M&A Online

⇧ ってな具合に、「スマホ決済」システムの作りの問題も絡んでますと。

ただ、その問題も、

丸亀製麺ではスマホ決済については一時的な使用停止で、全店舗へ導入ができるようシステム改修を進めているという。これは店舗側が顧客のスマホに表示されるバーコードをスキャナーで読み取る「バーコード支払い」に対応するためとみられる。こちらは(1)顧客がスマホを取り出す(2)決済アプリを開く(3)レジで顧客のバーコードをスキャンするの3ステップで済む。それでも非接触ICカード決済より1ステップ多い。

利用者も加盟店も?じわじわと広がる「スマホ決済離れ」の予兆(2ページ目) - M&A Online

⇧ とあるように、ほぼ解決できたと言っても良いのではないかと。

 

まぁ、「キャッシュレス社会」の流れは、ポイント還元が終了してからの期間の調査結果が出てこないと何とも言えないよね~。

 

むちゃくちゃ、脱線しましたが、今回は、Oracle Database 関連の話になるかと。

レッツトライ~。

 

Oracle Database のエラーが分かり辛い

もう、Oracleさんよ、エラーメッセージがカオスだな... 

www.noguopin.com

SQLで指定されている列名または文字列が正しく表記されていない場合に発生します。

ORA-904は予約語をオブジェクト名に使用した場合にも発生する。
予約語はV_RESERVED_WORDS表のKEYWORD列でで確認可能

ORA-00904 - 解決!ORACLE!

⇧ はい~、 「ORA-904」のエラーが紛らわしい...

そもそも、意味合いが異なる複数のエラーを1つのエラー記号に集約するのってどうなのかね?エラーメッセージの設計って、そういうもんなのかね?

まぁ、ボヤいてみたところで、何もかわることは無いんですがね...

上記サイト様を参考に、予約語を調べてみたんですが、

f:id:ts0818:20200611212403p:plain

⇧ おりましたよ、「USERS」が。

 

オブジェクトの中で予約語を使ってはならぬ

つまり、Javaで言うと、Oracle Database のテーブルとマッピングするクラスの中でOracle Database の予約語を一切使ってはならんのだと。(正確に言うとSQLが絡んでくるクラスで、データベースの予約語とバッティングしちゃうのが問題)

ちなみに、私がOracle Database にPDBを作成して、そのPDBに作成してたテーブルが、以下で、

f:id:ts0818:20200611220119p:plain

Javaのほうで作成してたEntityクラスが以下。

package com.example.multiple_module.db_first.domain.entity;

import java.sql.Timestamp;

import javax.persistence.Entity;
import javax.persistence.Id;

import lombok.Getter;
import lombok.Setter;

@Entity
@Getter
@Setter
public class Users {

	@Id
	private String userId;
	private String insertUser;
	private Timestamp insertDate;

}

⇧ 思いっきり、Entityクラスで、「USERS」とか作っちまってますけど(涙)。

f:id:ts0818:20200611212746p:plain

 

致し方ないので、Eclipseの「プロジェクト・エクスプローラー」で、該当のクラスを選択した状態で右クリックし、「リファクタリング(T)」>「名前変更(N)」でクラス名を修正しました。

あと、テーブルのカラム名とか認識できないらしいので、@cloumn アノテーション付けました。

package com.example.multiple_module.db_first.domain.entity;

import java.sql.Timestamp;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

import lombok.Getter;
import lombok.Setter;

@Entity
@Getter
@Setter
@Table(name = "Users")
public class UsersEntity {

	@Id
	@Column(name="USER_ID")
	private String userId;
	@Column(name="INSERT_USER")
	private String insertUser;
	@Column(name="INSERT_DATE")
	private Timestamp insertDate;

}

f:id:ts0818:20200611215549p:plain

で、いろいろ割愛してますけど、ビルドツールはMavenで、依存関係に、SpringBoot、SpringMVC、Thymeleaf、Lombok、SpringDataJPA、ojdbc、などなどを追加しております。

動かしてみたところ、

f:id:ts0818:20200611220303p:plain

無事に動きまして、

f:id:ts0818:20200611220348p:plain

@Controller 経由して、Oracle Database のデータを取得するビジネスロジックの処理を反映した、users.htmlを返すことに成功。

テーブルにデータが入ってないから、固定文言以外は何も表示されとらんけど。

f:id:ts0818:20200611220510p:plain

 

まぁ、何て言うか、いろんな前提を知らんと辛いよね...

分かってしまえば、そんなこと、ってことなのかも知らんけど、意外にその答えに辿り着くまでに時間がかかるけど、そりゃそうだ、自分にとって未知のことなんだから。

何事も未知のことに対しての調査が一番時間がかかるものなんですけど、IT業界は次から次へと情報が更新されるからね、辛い。

 

今回はこのへんで。