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

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

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

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

Java

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

Eclipse

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

Q&A

解決済

3回答

3568閲覧

指定行すべてを更新をしようとしています。

退会済みユーザー

退会済みユーザー

総合スコア0

Oracle

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

Java

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

Eclipse

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

0グッド

0クリップ

投稿2018/06/18 22:53

編集2018/06/19 02:15

OracleでSAMPLETABLEを作成し、選択行すべての更新をしたいと考えています。
(複数行あるテーブルです)
しかし、うまく動かずに困っております。
エラー:INまたはOUTパラメータがありません - 索引: 11

その後、ご指摘いただいたUPDATE文を修正しましたが違うエラーになりました。
エラー:列索引が無効です。

UPDATE文は、ID列以外のすべてのデータの更新をしようとしています。
Oracleへの接続、WHERE句を除いた時のデータは更新できています。
(構造としては、フォームに?の内容を記入してもらう形です)
エラーに意味も、ググったのですがよくわからず困っています。

oracle 12c,eclips,java8で動かしています。
ご回答よろしくお願いします。
追記:CREATE文、Javaソースコードを記載します。

SQL

1 CREATE TABLE SAMPLETABLE 2 (ID NUMBER GENERATED ALWAYS AS IDENTITY MAXVALUE 9999 INCREMENT BY 1 NOT NULL 3 , HIDUKE VARCHAR2(20) NOT NULL 4 , NAME VARCHAR2(20) NOT NULL 5 , YOTEI VARCHAR2(200) NOT NULL 6 , ZISSEKI VARCHAR2(200) NOT NULL 7 , TOKKI VARCHAR2(200) NOT NULL 8 , SHOKAN VARCHAR2(200) NOT NULL 9 , KAKUNO VARCHAR2(20) NOT NULL 10 , ZIKAIYOTEI VARCHAR2(200) 11 , KOMENTO VARCHAR2(200) 12 , BIKO VARCHAR2(100) 13 , PRIMARY KEY ("ID")); 14

Java

1 2JAVAのソースコードです。 3 4public Gyomu selectById(int id) throws SQLException { 5 6 //変数定義 7 8 Connection conn = null; 9 List<Gyomu> gymList = new ArrayList<Gyomu>(); 10 PreparedStatement ps = null; 11 ResultSet rs = null; 12 13 //DB接続情報を設定する 14 conn = this.getConn(); 15 16 // SQL文を定義する 17 String rss = "SELECT * FROM SAMPLETABLE WHERE ID = ?"; 18 19 try { 20 //JDBCドライバをロードする 21 Class.forName("oracle.jdbc.driver.OracleDriver"); 22 23 //実行するSQL文とパラメータを指定する 24 ps = conn.prepareStatement(rss); 25 ps.setInt(1, id); 26 27 //SELECTを実行する 28 rs = ps.executeQuery(); 29 30 //取得した結果を全件出力する 31 rs.next(); { 32 Gyomu gyomu = new Gyomu(); 33 gyomu.setId(rs.getString("ID")); 34 gyomu.setName(rs.getString("NAME")); 35 gyomu.setYotei(rs.getString("YOTEI")); 36 gyomu.setZisseki(rs.getString("Zisseki")); 37 gyomu.setTokki(rs.getString("TOKKI")); 38 gyomu.setShokan(rs.getString("SHOKAN")); 39 gyomu.setKakuno(rs.getString("KAKUNO")); 40 gyomu.setZikaiyotei(rs.getString("ZIKAIYOTEI")); 41 gyomu.setKomento(rs.getString("KOMENTO")); 42 gyomu.setBiko(rs.getString("BIKO")); 43 gyomu.setHiduke(rs.getString("HIDUKE")); 44 45 46 gymList.add(gyomu); 47 } 48 49 } catch (Exception ex) { 50 //例外発生時の処理 51 ex.printStackTrace(); //エラー内容をコンソールに出力する 52 53 } finally { 54 this.close(conn); 55 } 56 57 return gymList.get(0); 58 59 } 60 61 public List<Gyomu> findAll() { 62 63 List<Gyomu> gymList = new ArrayList<Gyomu>(); 64 65 Connection conn = null; 66 try { 67 68 conn = this.getConn(); 69 70 // SELECT文を準備 71 String sql = "SELECT * from SAMPLETABLE"; 72 PreparedStatement pStmt = conn.prepareStatement(sql); 73 74 // SELECTを実行し、結果票を取得 75 ResultSet rs = pStmt.executeQuery(); 76 77 // 結果票に格納されたレコードの内容をGyomuインスタンスに設定し、ArrayListに追加 78 while (rs.next()) { 79 Gyomu gyomu = new Gyomu(); 80 81 System.out.println(rs.getString("ID")); 82 83 gyomu.setId(rs.getString("ID")); 84 gyomu.setName(rs.getString("NAME")); 85 gyomu.setYotei(rs.getString("YOTEI")); 86 gyomu.setZisseki(rs.getString("Zisseki")); 87 gyomu.setTokki(rs.getString("TOKKI")); 88 gyomu.setShokan(rs.getString("SHOKAN")); 89 gyomu.setKakuno(rs.getString("KAKUNO")); 90 gyomu.setZikaiyotei(rs.getString("ZIKAIYOTEI")); 91 gyomu.setKomento(rs.getString("KOMENTO")); 92 gyomu.setBiko(rs.getString("BIKO")); 93 gyomu.setHiduke(rs.getString("HIDUKE")); 94 95 //Gyomuクラスのgyomuに値を格納する。 96 97 gymList.add(gyomu); 98 99 } 100 } catch (SQLException e) { 101 e.printStackTrace(); 102 return null; 103 } finally { 104 this.close(conn); 105 } 106 return gymList; 107 } 108 109 public boolean create(Gyomu gyomu) { 110 111 Connection conn = null; 112 113 try { 114 115 conn = this.getConn(); 116 117 //INSERT文の準備(idは自動連番なので指定しない) 118         String sql = "UPDATE SAMPLETABLE SET HIDUKE='?', NAME='?', YOTEI='?', ZISSEKI='?', TOKKI='?', SHOKAN='?', KAKUNO='?', ZIKAIYOTEI='?', KOMENTO='?', BIKO='?' WHERE ID=?"; 119 120 PreparedStatement pStmt = conn.prepareStatement(sql); 121 //INSERT文中の「?」に使用する値を設定し、SQLを完成 122 123 pStmt.setString(1, gyomu.getHiduke()); 124 pStmt.setString(2, gyomu.getName()); 125 pStmt.setString(3, gyomu.getYotei()); 126 pStmt.setString(4, gyomu.getZisseki()); 127 pStmt.setString(5, gyomu.getTokki()); 128 pStmt.setString(6, gyomu.getShokan()); 129 pStmt.setString(7, gyomu.getKakuno()); 130 pStmt.setString(8, gyomu.getZikaiyotei()); 131 pStmt.setString(9, gyomu.getKomento()); 132 pStmt.setString(10, gyomu.getBiko()); 133 134 //INSERT文を実行 135 int result = pStmt.executeUpdate(); 136 137 if (result != 1) { 138 return false; 139 } 140 141 } catch (SQLException e) { 142 e.printStackTrace(); 143 return false; 144 145 } finally { 146 this.close(conn); 147 148 } 149 return false; 150 151 } 152 153 private Connection getConn() { 154 Connection conn = null; 155 try { 156 //JDBCドライバの読み込み 157 Class.forName("oracle.jdbc.driver.OracleDriver"); 158 conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "system", "orcl"); 159 } catch (SQLException e) { 160 e.printStackTrace(); 161 } catch (ClassNotFoundException e) { 162 e.printStackTrace(); 163 } 164 return conn; 165 } 166 167 private void close(Connection conn) { 168 // データベースの切断 169 if (conn != null) { 170 try { 171 conn.close(); 172 } catch (SQLException e) { 173 e.printStackTrace(); 174 } 175 } 176 } 177 178 179 180

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/06/18 23:01

あなたはSQLとエラーメッセージでわかると思ってるの?(まあ原因は2つほど考えられはするが)
退会済みユーザー

退会済みユーザー

2018/06/18 23:05

すみません。もっとコードを書いたほうがいいですか?
退会済みユーザー

退会済みユーザー

2018/06/18 23:06

SQL文が間違っていると判断して、情報を少なく書いてしまいました。
Orlofsky

2018/06/18 23:15

UPDATE文を実行するにはCREATE TABLEが必要です。 >エラー:INまたはOUTパラメータがありません - 索引: 11 も表示される最低限のコードを提示しないと誰にもわかりません。
退会済みユーザー

退会済みユーザー

2018/06/18 23:18

申し訳ありませんでした。 すぐ追記いたします。
m.ts10806

2018/06/19 00:24

回答への返信より質問内容の充実を優先させてください。推測で回答が進むのも良くありません。
退会済みユーザー

退会済みユーザー

2018/06/19 01:54

質問内容の変更がうまくできていませんでした。(次回から、更新したのをよく確認します)
m.ts10806

2018/06/19 01:59

プレビューを確認しながら編集すれば良いかとは思いますが、ひとまずSQL系とプログラムコード系(今回はJava)はわけていただけますか?コードブロック冒頭の```を```sql ```javaのように言語名を書くと言語名にあったハイライトをしてくれますし、より見やすくなります。コードを見やすくすることで回答も得やすくなります。なぜならコードブロックにはコードコピー機能があるため、再現確認がしやすくなるからです。
退会済みユーザー

退会済みユーザー

2018/06/19 02:09

ご指摘ありがとうございます。今後質問していくときも、言語名を分けて、質問していただける方が見やすいように心がけます。
guest

回答3

0

ベストアンサー

データパッチ等でない限り、一般的な更新はキーを条件にするものです。
IDがキーなら以下のようになります

JAVA

1String sql = "UPDATE SAMPLETABLE SET HIDUKE=?, NAME=?, YOTEI=?, ZISSEKI=?, TOKKI=?, SHOKAN=?, KAKUNO=?, ZIKAIYOTEI=?, KOMENTO=?, BIKO=? " 2+ "WHERE ID=?;"

複数行のID以外のすべての項目を更新すると言われているので、データパッチが目的なら、DBツールで直接変更したほうが手っ取り早いですよ。

そうではなくて、システム的に組み込む処理と言われるなら、キーで更新するように、仕様を見直ししたほうが良いかと思います。

投稿2018/06/19 00:13

編集2018/06/19 02:32
sazi

総合スコア25138

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

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

sysjojo

2018/06/19 00:27

複数行を一括更新したいのかと思ったので、WHERE句にあえて触れませんでしたが、確かに対象が分かりにくくなるので、キー指定でやったほうがいいですね。複数行一括でやりたいならEXISTSなりINなり使えば良いですし。
sazi

2018/06/19 00:52

ちょっと言葉足らずだったので、追記しました。
guest

0

動的SQLだと思いますが、このクエリにパラメータはいくつ渡してますか?

エラー:INまたはOUTパラメータがありません - 索引: 11

WHERE句なしなら更新できる、ということであればWHERE句以降の?に値がバインドできてないものかと。
WHERE句の?が11個めですし、10個しかパラメータ渡してないのでは?

投稿2018/06/18 23:50

sysjojo

総合スコア325

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

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

退会済みユーザー

退会済みユーザー

2018/06/18 23:58

パラメータは11個あります。 ID列は、更新できないように11個中10個のパラメータを渡すように書きたいと思っています。
sazi

2018/06/19 00:02

条件と更新値が同じなら更新する必要無いですよね。 条件用と更新用のパラメータを合わせたものが必要だと思いますけど。
sysjojo

2018/06/19 00:06

SET句、という意味ではなく、?に対応して渡した値の数がいくつあるか、という意味でパラメータと使いました。 ?が全部で20個あるので、渡す値は20個要ると思うのですが、10個しか渡していないのであれば11個めの値がない、といってこのエラーが出ているのだと。
m.ts10806

2018/06/19 01:17

既に原因と回答がほぼ出ているのでこちらでコメントさせていただきます。 > 11個中10個のパラメータを渡すように書きたいと思っています。 語句の意味を間違っていますよ。 http://wa3.i-3-i.info/word1443.html 処理結果に影響を与える外部から投入される変動要素(外から入ってくる値) 11個あるのはあくまでSAMPLETABLEという名前のテーブルの「カラム」ですよね(CREATE文の提示が未だないので推測でしかありませんが)。既に指摘があるとおり「パラメータ」は「20個」SQLにセットされています(sysjojoさんのコメント通り) Javaのコードがないからなんとも言えないのですが、「パラメータ」をセットしている数が足りてない(用意された?パラメータの数とセットされたパラメータの数が合ってない)という意味です。 あとはsaziさんの回答にもある通り、「ある特定の情報を更新」したいのであればWhereは「プライマリーキー」のみ指定すれば良いです。 ID以外の全ての情報を以てその情報は特定可能と言い切れますか?Whereから特定しようと思うと、更新前の情報全てどこかに持っておかなければなりませんが、そこは認識できていますか? ということなので「不変が約束されているID」”のみ”をWhere句に入れるのが妥当です。
退会済みユーザー

退会済みユーザー

2018/06/20 05:33

ID以外の全ての情報を以てその情報は特定可能と言い切れますか?Whereから特定しようと思うと、更新前の情報全てどこかに持っておかなければなりませんが、そこは認識できていますか? ということなので「不変が約束されているID」”のみ”をWhere句に入れるのが妥当です。 →意識していませんでした。ありがとうございます。
guest

0

WHERE の条件は , でつないでいくのではありません。今回の案件ではANDでしょう。

SQL

1UPDATE ... 2HIDUKE=? AND NAME=? AND ...

SQL文中の文字列はシングルクォートで囲んでください。

投稿2018/06/18 23:22

Orlofsky

総合スコア16415

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

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

退会済みユーザー

退会済みユーザー

2018/06/18 23:36

String sql = "UPDATE SAMPLETABLE SET 'HIDUKE'=?, 'NAME'=?, 'YOTEI'=?, 'ZISSEKI'=?, 'TOKKI'=?, 'SHOKAN'=?, 'KAKUNO'=?, 'ZIKAIYOTEI'=?, 'KOMENTO'=?, 'BIKO'=? " + "WHERE 'HIDUKE'=? AND 'NAME'=? AND 'YOTEI'=? AND 'ZISSEKI'=? AND TOKKI=? AND SHOKAN=? AND KAKUNO=? AND ZIKAIYOTEI=? AND 'KOMENTO'=? AND 'BIKO'=?"; で間違ってないですかね? うまくコンパイルできず...
Orlofsky

2018/06/18 23:44

誰が列名をシングルクォートで囲め、って言いました?シングルクォートで囲むのは = の右が文字列だったら、文字列をシングルクォートで囲んでください。 それと、質問にCREATE TABLE文を載せて、質問のUPDATEを修正しましょう。 >Oracle SQL 入門 レベルの勉強はきちんとやってください。
退会済みユーザー

退会済みユーザー

2018/06/19 00:06

すみませんでした。
Orlofsky

2018/06/19 02:12

>String sql = "UPDATE SAMPLETABLE SET HIDUKE='?', NAME='?', YOTEI='?', ZISSEKI='?', TOKKI='?', SHOKAN='?', KAKUNO='?', ZIKAIYOTEI='?', KOMENTO='?', BIKO='?' WHERE ID='?'"; シングルクォートで囲むのは文字列だけです。 IDはNUMBER型ですから ? はシングルクォートで囲まないでください。
退会済みユーザー

退会済みユーザー

2018/06/19 02:30

ありがとうございます。 sql文を変更しました。
退会済みユーザー

退会済みユーザー

2018/06/19 02:54

用意しています。sqlの操作をDAOで行い、insertすることはできています。
sysjojo

2018/06/19 04:56 編集

executeUpdateする前のgyomu.get○○は意図している値が取れていますか?(null値が入ってるとか。) あと、?の数とsetStringの数あってます?整理する意味でもバインド変数に名前付けてみては? https://qiita.com/RYO-4947123/items/7193b5007820bae22f31
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問