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

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

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

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Oracle

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

Java

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

SQL

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

Q&A

4回答

20082閲覧

自動採番値の取得方法

退会済みユーザー

退会済みユーザー

総合スコア0

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Oracle

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

Java

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

SQL

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

0グッド

1クリップ

投稿2018/07/31 03:24

編集2018/07/31 11:11

javaで、自動採番のセルの番号を取得することになりました。
やりたいこと:自動採番になっているMASTERテーブルの番号を取得したいです。

エラー内容:
Exception in thread "main" java.sql.SQLException: 列の型が無効です。: getInt not implemented for class oracle.jdbc.driver.T4CRowidAccessor
at oracle.jdbc.driver.GeneratedAccessor.getInt(GeneratedAccessor.java:372)
at oracle.jdbc.driver.GeneratedStatement.getInt(GeneratedStatement.java:197)
at oracle.jdbc.driver.GeneratedScrollableResultSet.getInt(GeneratedScrollableResultSet.java:244)
at dao.SampleDAO.main(SampleDAO.java:32)

SampleDAO.java:32は、BigDecimal id = rs.getBigDecimal(1);の部分です。

Java

1package dao; 2 3package dao; 4 5import java.math.BigDecimal; 6import java.sql.Connection; 7import java.sql.ResultSet; 8import java.sql.SQLException; 9import java.sql.Statement; 10 11/** 12* SuperDAOにドライバーの接続情報は記載しています。 13**/ 14 15public class SampleDAO { 16 17 public static void main(String[] args) throws ClassNotFoundException, SQLException { 18 19 ConnectManager connectManager = new ConnectManager(); 20 Connection conn = null; 21 conn = connectManager.getConn(); 22 Statement stat = conn.createStatement(); 23 24 // SELECT文を準備 25 String sql = "insert into MASTER (NAME) values ('尾山')"; 26 27 stat.execute(sql, Statement.RETURN_GENERATED_KEYS); 28 29 30 ResultSet rs = stat.getGeneratedKeys(); 31 32 try { 33 while(rs.next()) { 34 rs.getInt(1); 35 BigDecimal id = rs.getBigDecimal(1); 36 System.out.println(id); 37 38 } 39 40 } finally { 41 rs.close(); 42 } 43 } 44} 45

sql

1 2CREATE TABLE MASTER( 3 SPECIAL NUMBER GENERATED ALWAYS AS IDENTITY MINVALUE 1 MAXVALUE 99999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER NOCYCLE NOKEEP NOSCALE NOT NULL 4 ,NAME nvarchar2(5))

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

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

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

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

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

sazi

2018/07/31 03:40

前の質問で解決したんじゃなかったの?
退会済みユーザー

退会済みユーザー

2018/07/31 03:41

javaで実現することになり...
退会済みユーザー

退会済みユーザー

2018/07/31 03:46 編集

前のご回答いただいたsqlも、うまく動かせず.....八方塞がりの状況です。
sazi

2018/07/31 03:57

前の質問もinsertに関する質問なのにupdateのコードでしたし、よく分からないなら先輩に聞くのが早いかと思いますけど
退会済みユーザー

退会済みユーザー

2018/07/31 04:00

聞けない状況でして...
退会済みユーザー

退会済みユーザー

2018/07/31 04:02

前の質問のコードが間違えていたのを今気づきました。ほんと、回答いただいた方やほかの方にも申し訳ない気持ちです。
sazi

2018/07/31 04:52

JDBCタグ付けるとピンポイントな回答があるかもしれません
Orlofsky

2018/07/31 06:44

解決していないのにベストアンサーしてはいけません。
退会済みユーザー

退会済みユーザー

2018/08/01 13:54 編集

なんとか、上記の部分は今先ほど解決できました。preparestatementでsqlを記述するときは、;(コロン)が必要ない、付属しているとエラーになるということでした。 解決済にしておきます。本当にありがとうございました。
boyon

2018/08/08 03:22

このスレッドって、あとから見ても、何をやって完了したのかがわかりづいらいですね。質問者さんは最後にまとめを書いたほうがよいんじゃないですかね。いろんな方が助言してくれることですし。
退会済みユーザー

退会済みユーザー

2018/08/12 06:32

申し訳ありません。どのように解決したのか、記載します。
guest

回答4

0

以下が参考になりませんか。
JDBCでINSERT後のシーケンス値を取得する
エラーについては、多分受け取る型があっていないんじゃないかと思います。

投稿2018/07/31 04:15

編集2018/07/31 05:50
sazi

総合スコア25174

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

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

退会済みユーザー

退会済みユーザー

2018/07/31 04:22 編集

ヒントで調べてもいないのですか? → 調べています。でもどうしても解決できないエラーで質問しています。 いくつかのサイトをみて、ここに記載してある方法なら、できそうだと思い自分のサンプルコードに応用しています。 参考サイト:http://www.ne.jp/asahi/hishidama/home/tech/java/jdbc_meta.html 自助努力しているように感じなかったら、本当申し訳ありません。でも自分でも精一杯やっていて...
sazi

2018/07/31 04:26

失礼しました。 あなたの努力を否定するつもりはありません。 主観的ですが、結果としては(まだ)不足があると感じました。
退会済みユーザー

退会済みユーザー

2018/07/31 04:34

不足がありますよね。なかったら結果が出ていますし... 早く目に見える結果が出ればいいんですがなかなか思うように進まないです。
boyon

2018/07/31 04:47

なかなか答えを教えてもらえませんね。私はこの回答に興味があってクリップしています。 私はjavaを書けないので答えを知りません。 insert を executeしたあとに、番号が返ってくるものなの? rs ってどこでセットしてるんだろう?? と、興味津々で読んでいます。 頑張ってください。
退会済みユーザー

退会済みユーザー

2018/07/31 05:43

boyonさん、応援ありがとうございます。回答を提示できるように、必死でネットサーフィンしています。
退会済みユーザー

退会済みユーザー

2018/07/31 05:47

回答いただいているため、解決できるよう頑張りたいです。
sazi

2018/07/31 05:52

umyuさん そもそもリンク先を間違えていました。 指摘ありがとうございます。
umyu

2018/07/31 05:53

@saziさんへ 編集ありがとうございました。
sazi

2018/07/31 05:54

boyon さん 教えないのではなくてjavaあまり詳しくないんですよ、すみません。
rubytomato

2018/07/31 06:18

こちらのサイトが参考になるかもしれません。 JDBCで、OracleのINSERT文でシーケンスでプライマリキーを採番したときのプライマリキーの取得方法 https://gist.github.com/seraphy/3243901 Oracleのことはよく知りませんが、質問で貼付しているコードと、こちらのサイトのコードでは、 Statementの生成方法とstat.getGeneratedKeys()の実行に違いがあるように思います。 とくに気になっているのが「ResultSet rs = stat.getGeneratedKeys();」の位置です。 これは「stat.execute(sql, Statement.RETURN_GENERATED_KEYS);」の後に実行するものではないのでしょうか?
boyon

2018/07/31 07:42

rubytomatoさんのリンク先は、「そのまんま」という気がしますね。InsertとしたレコードのIDを返す機能ってJDBCの標準的なものなんですかね。知りませんでした。。。まぁでも、自分で書いたレコードのPKがわからないと後続の処理で困ることがあるかもしれませんね。
guest

0

聞けない状況でして...

ここでの質問、回答への態度を見るとその状況もなぜか推して知るべし。。。という感じですが。

調べています。でもどうしても解決できないエラーで質問しています。

いくつかのサイトをみて、ここに記載してある方法なら、できそうだと思い自分のサンプルコードに応用しています。
「いくつかの」サイトとはどれくらいの数でしょうか?
できないのであれば別のサイトを見るべきです。次へ次へ、検索していきましょう。
たったの半日(睡眠時間も考えると数時間)で前の質問をほっぽって新しくほぼ同じような質問をすると言う部分が「努力していない」と言われているのですよ。

【Java】BigDecimalをちゃんと使う2018

を見ればわかりますが、Resultsetで指定するのは数値ではなく列名です。
しかも"1"を指定してしまったら返り値は"1.0"になるだけでは?

失礼しました、index指定ですね。。。

まず、何をどうしたいか、何を使用するのかを明確にして、使用する物はどういうものかきちんと確認後に作業しましょう。
そうすれば、自分ができない部分が何かを知る助けにもなりますし、質問する際にもう少しわかりやすく説明する事ができると思いますよ。

そして、「エラーが出るんです」ではなく、「~(エラーメッセージ)というエラーが出てしまい困っています」など、何がどうおかしいのか提示してくれない事には現状ではアドバイスしようにもどうしていいやらよくわかりません。

ソースを見た限りでは出力しているidとやらはテーブル関係なく生成している(できているかどうかは別にして)ようなので、どうやっても期待する結果は出ないと思います。
MASTERの値が欲しい(しかも自動採番とわかっている)んですから、InsertしたレコードのSPECIALを取得しないと意味がないのでは?

"Statement.RETURN_GENERATED_KEYS"で検索したら1ページ目にsazi 様提示のページがヒットします。
教えてくれた先輩も、わからないならせめて検索結果の1ページは全部目を通すくらいはして欲しいと思うはずですよ。

投稿2018/07/31 04:43

編集2018/07/31 05:27
yukihisa

総合スコア672

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

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

退会済みユーザー

退会済みユーザー

2018/07/31 05:40 編集

ご回答ありがとうございます。エラー内容は提示していて、最終行の結果セットがエラーの内容です。
yukihisa

2018/07/31 05:42

「最終行の結果セット」というエラーが出るのですか? エラーメッセージは「最終行の結果セット」で間違いないですか? SQL文も何も投げずに生成(できてない)してるので、 エラー内容は「(英語で)そんな列ねーよ」となると思っているのですが。
退会済みユーザー

退会済みユーザー

2018/07/31 05:46

列の型が無効ですと出るようになりました。(他のサイトを見てサンプルコードが若干形を変えました)
yukihisa

2018/07/31 05:58

どう形を変えたのか追記して頂かないと、「で?」としか。。。 何度言っても通じていない様なのでもう一度いいますが、エラーメッセージはそのままコピペで提示してください。 どの部分でどの列の型がどうおかしくて無効なのかがさっぱりわかりません。 処理を変えたのなら変更後のソースも提示してください。 まずはマニュアルを熟読してください。 https://teratail.com/help/question-tips そもそもStatement.RETURN_GENERATED_KEYSが何かわかってらっしゃらないと思いますが。。。 rsを設定する場所がそもそも違うので、元から変えないとうまくいかないです。
退会済みユーザー

退会済みユーザー

2018/07/31 05:59

どう形を変えたのか追記して頂かないと、「で?」としか。。。 →すみません。トイレ行ってました。もうちょい待ってください。
退会済みユーザー

退会済みユーザー

2018/07/31 06:04

エラー内容、コードを変更しました。 ですが根本的に間違っているのを変更する方法は、わかりません。
sazi

2018/07/31 06:14

>rs.getInt(1); 上記は何をやろうとしてますか? 不要じゃないですか?
退会済みユーザー

退会済みユーザー

2018/07/31 06:17 編集

不要でした。ありがとうございます。削除しましたがエラー結果は変わりませんでした。
yukihisa

2018/07/31 06:19

sazi 様 そもそも、GYOMUHOUKOKUのKANRINOをHOUKOKUSAKIに持って行きたい、というのが前回と今回の目標で、なんで自動採番時にintでインクリメントしている列を取得するのにDecimalになっちゃうの?というところから突っ込みたいです! ほんとはrs.getInt(1)をidに持ってこなきゃいけないはずなのです。
yukihisa

2018/07/31 06:38

削除してもエラーが出るのであっても、エラーは変わるはずです。 エラーはgetIntがおかしいよ、となっているので。
sazi

2018/07/31 07:21

オートナンバーのprimarykeyはnumber型なのでマッピングされるjdbcの型は、mumberかdecimalじゃないかと思うのですが、intで大丈夫なのですか?
yukihisa

2018/07/31 07:25

申し訳ない、integerに空目したあともうintだと思い込んでおりました。。。 decimalでいいですね、お恥ずかしい。
guest

0

INSERT文にRETURNING がないですけどそれで良いのですか?

JDBCですが、DBC経由でシーケンスを使用して採番した値の取得 が役に立つかも?

CallableStatement statement = con.prepareCall(

"begin insert into test (ID, NAME) " + " values (TEST_SEQ.nextval, ?) returning id into ?; end;");

投稿2018/07/31 07:04

Orlofsky

総合スコア16415

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

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

sazi

2018/07/31 07:24

RETURNINGする場合は単に項目として取り出せばいいだけですね。 質問の内容とは違います
yukihisa

2018/07/31 07:29

今回はどうも先輩からjava側で制御しろと言われているようですね。 Orlofsky 様の修正依頼見て初めて知りましたが、これ5日前から同じ問題の中で止まっているんですね。。。 先輩もお怒りになっていそうですね。。。
Orlofsky

2018/07/31 07:30

RETURNINGを使えばSQLを1回実行するだけで済みます。パフォーマンスを気にしないなら構いませんが。
sazi

2018/07/31 08:06 編集

Statement.RETURN_GENERATED_KEYSをパラメータにしても問い合わせ回数が増えるわけじゃないから、変わらないと思いますよ。
Orlofsky

2018/07/31 08:17 編集

そうでしたか。すっかりSQLがもう1回発行されるものと思っていました。すみません。
guest

0

長くなってしまったので別回答で失礼します。

まず、エラーはBigDecimal id = rs.getBigDecimal(1);ではなくrs.getInt(1);で起きていますね。

java

1 try { 2 while(rs.next()) { 3 rs.getInt(1); 4 BigDecimal id = rs.getBigDecimal(1); 5 System.out.println(id); 6 7 } 8 9 } finally { 10 rs.close(); 11 } 12

なので、

int id = rs.getInt(1);

に変更してやればイケると思います。
で、目標としてはそいつをprintではなくてHOUKOKUSAKIにinsertする値として使い回すという感じでしょうか。

追記

OracleのJDBCドライバは、Statement.RETURN_GENERATED_KEYSを使用するときに生成された列を返さず、代わりにROWIDを返すそうです。
ROWIDは、「ROWIDデータ型」または「UROWIDデータ型」を持つため、getIntできないのではないかと推測されます。
そのため、実際に生成されたキーがどのフィールドであるかはわからないので、明示的にどの列が自動生成される列かを指定してあげないといけません。
なので、

java

1 // SELECT文を準備 2 String sql = "insert into MASTER (NAME) values ('山添')"; 3 4 String generatedColumns[] = { "SPECIAL" }; 5 stat.execute(sql, generatedColumns); 6

と変更する必要があるかもしれません。(Oracleであれば)

投稿2018/07/31 06:33

編集2018/07/31 06:56
yukihisa

総合スコア672

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

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

sazi

2018/07/31 07:28

元々の質問では親を追加してそのキーを子に付加して追加という内容だったかと思います。 それで、RETURN_GENERATED_KEYSでrowidが返されるなら、既に破綻していますね。
yukihisa

2018/07/31 07:34

英文ですがstackoverflowに同様の現象について質問/回答があったので。 https://stackoverflow.com/questions/19270465/invalid-column-type-getint-not-implemented-for-class-oracle-jdbc-driver-t4crowi この辺りは便利だけど実用時には困りますね。。。 確かに、先輩からの指示であるRETURN_GENERATED_KEYSを使え、というのは不可能ですね。 素直にOrlofsky 様のRETURNINGで対応した方が良い気がします。
yukihisa

2018/07/31 07:41

エラーにも getInt not implemented for class oracle.jdbc.driver.T4C”Rowid”Accessor と出ているので、rowidを取ってきているのは間違いないですね。
退会済みユーザー

退会済みユーザー

2018/07/31 14:45

回答いただいた方法では解決が難しい状況です。 なので、下記方法を試しています。 ①シーケンスを作成。 ②resultsetでシーケンスの番号を取得 ③親と子に付与
yukihisa

2018/08/01 00:25

何をどうやってどうなったから解決できないのですか? 今までの貴方の質問のほとんどに言えることですが、助言を求めておきながら途中で投げ出して適当にやろうとして、さらに深みにはまっていますよ? 本日でこの問題、6日目ですよね? その前のjavaの質問含めたら10日以上かかって結果成果物としては何も出来ていないですよね。 きちんと何ができて何処からできないか、助言を基にどう変えて今度はどこで引っかかったか報・連・相をしないといつまでもできません。 現状は全て中途半端にわからないまま次に適当に手を出してを繰り返しているだけです。 そのような態度であるならば、教える側も教えようがありません。 あと少しで出来るところを投げ出して、報告もなしに別の方法へシフトする。 。。。を繰り返し過ぎて先輩にも聞ける状況ではないのではないですか? そもそも方法を変えるのが可能であるならば、Orlofsky 様提示のコードで実装するのが最適だと思います。 貴方のやり方はシーケンスの正しい使用方法ではありません。
退会済みユーザー

退会済みユーザー

2018/08/01 13:42

何をどうやってどうなったから解決できないのですか? →すみません。ちゃんと説明できなかったことをお詫びします。 yukihisaさんの方法で実装しましたが同じ内容のエラーになりました。
退会済みユーザー

退会済みユーザー

2018/08/01 13:46 編集

実装の期限がタイトなこともあり、変更せざるを得ませんでした。 熟練の会社の人にも見てもらいましたが、どうしても解決できませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問