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

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

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

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

JDBC

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

Java

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

SQL

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

3回答

904閲覧

OracleのSELECT文をDAOから発行するとResultSetが増殖します。

TAKAO-WATANUKI

総合スコア14

Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

JDBC

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

Java

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

SQL

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2019/06/18 06:03

編集2019/06/18 08:13

いつもお世話になっております。
質問ばかりで申し訳ないのですが、以下の現象に悩まされております。
・Oracleに対しJavaのDAOからクエリを発行するとResultSet内のレコードが増殖する。

起きている現象

以下のDAOプログラムを実行すると実データより遥かに多いResultSetが返却されます。

java

1 public static List<String> getAvailabilityAccessToken() throws SQLException { 2 3 String sql = "SELECT ACCESS_TOKEN FROM AAAA_ACCTKN_TBL WHERE MESSAGE_KIND = 'FT' AND REVOKE_POSTED_DATE IS NULL" 4 + " ORDER BY ACCESS_TOKEN_EXP_DT DESC"; 5 List<String> accessTokenList = new ArrayList<>(); 6 7 ResultSet rs = null; 8 9 try { 10 Class.forName("oracle.jdbc.driver.OracleDriver"); 11 conn = DriverManager.getConnection(path, id, pw); 12 ps = conn.prepareStatement(sql); 13 14 logger.info("AaaaDAOImpl.getAccessToken SQL Execute"); 15 rs = ps.executeQuery(); 16 17 while (rs.next()) { 18 accessTokenList.add(rs.getString("ACCESS_TOKEN")); 19 } 20 } catch (Throwable t) { 21 logger.info("AaaaDAOImpl.getAccessToken SQL ERROR"); 22 return null; 23 } finally { 24 if (rs != null) { 25 rs.close(); 26 } 27 if (ps != null) { 28 ps.close(); 29 } 30 if (conn != null) { 31 conn.close(); 32 } 33 } 34 35 return accessTokenList; 36 37 }

テーブルの中身は以下の通りです。

tableData

1\: ACCESS_TOKEN 2 1:ACCESS-TOKEN000000000000000000000003 3 2:69ubXK04kKnSCAuwPjs5zKNKLtbluvKuzYNb 4 3:nvMEZbTSwRwiutDDfzavSHT5F7dipH1nIQ9o 5 4:pBg5dN5SU1kfT0OnmS826OEoJ08Zh4dWkOKb 6 5:zjh3K7Zsp2ML4pPJ7tJcnsxmPF4W7Q2k9VXU 7 6:4VmPc0WWOunzhyN44d7kmcC6o4egS9QI1E0M 8 7:ZDKw7XcttWgW2D2uoyJoYnySmGamoKxbMFQr 9 8:e5KhNU2EBfuKu4YdpsXcyy33Bbnly4Cyg2se 10 9:ACCESS-TOKEN000000000000000000000003 1110:ACCESS-TOKEN000000000000000000000004 1211:ACCESS-TOKEN000000000000000000000008 1312:ACCESS-TOKEN000000000000000000000009 1413:ACCESS-TOKEN000000000000000000000005 1514:ACCESS-TOKEN000000000000000000000002 1615:ACCESS-TOKEN000000000000000000000001

確認した事

・OracleDeveloperから生SQLを発行し、Responseの件数を確認しました。
本来取得したいレコード以外のデータは入り込んでいませんでした。

試した事

最初、リザルトセットの変数はクラスフィールドに宣言していました。
static宣言がまずいのではと思い、メソッド内のローカル変数として定義しなおしましたが、現象は変わりませんでした。

実際にプログラムで返却されるリストは300件を超えています。

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

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

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

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

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

guest

回答3

0

書かれているコードでわかる範囲では特に動作が異なる問題はないので、SQL Developerで接続しているデータベースと、Javaコードから接続しているデータベースが同じアドレスであるのかを確認されるのが良いでしょう。

投稿2019/06/18 13:15

A-pZ

総合スコア12011

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

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

TAKAO-WATANUKI

2019/06/19 03:43

ご回答ありがとうございます。詳細は解決コメントに書きますが、他の人が別端末から同じDBに接続したら該当レコードが300件以上出て来ました。 それが原因かと思われます。
guest

0

実際の該当するテーブルのレコード件数と違いますか?

SQL

1SELECT COUNT(*) AS COUNTS 2FROM AAAA_ACCTKN_TBL 3WHERE MESSAGE_KIND = 'FT' 4AND REVOKE_POSTED_DATE IS NULL ;

レコード件数が同じ場合は、Javaの結果をテキストファイルに落として、
sqlplus から

SQL

1SET NULL null 2SELECT * 3FROM AAAA_ACCTKN_TBL 4WHERE MESSAGE_KIND = 'FT' 5AND REVOKE_POSTED_DATE IS NULL 6ORDER BY ACCESS_TOKEN_EXP_DT DESC ;

の結果と diff を取得しては?

投稿2019/06/18 07:45

Orlofsky

総合スコア16415

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

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

TAKAO-WATANUKI

2019/06/18 07:50

ご回答ありがとうございます。 ご指摘の手を試してみます。 また何か進展がありましたらご報告いたします。
guest

0

自己解決

いまいち腑に落ちませんが解決いたしました。
私の端末からDBに接続するとレコードが15件しか出て来ませんでしたが、チーム内の他の人の端末から同一(だと思う)DBへアクセスし、SELECTをかけると300件以上ヒットしました。
問題の300件を削除した所、きちんと動く様になりました。
お騒がせいたしました。

投稿2019/06/19 03:46

TAKAO-WATANUKI

総合スコア14

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問