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

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

ただいまの
回答率

90.53%

  • Oracle

    601questions

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

INSERT文のエラーについて

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 166

e-power-ma

score 32

このSQLの悪いところがわかりません。
SQLException:列索引が無効です。

頭の中が????だらけです
A5SQLだとうまくいくのに、なぜだめなのでしょうか。

バージョン:Oracle12cです。

public boolean create(Gyomu gyomu) throws SQLException, ClassNotFoundException {

        Connection conn = null;

        try {

            conn = connectManager.getConn(false);

            // INSERT文の準備(idは自動連番なので指定しない)WHERE句で指定する
            // StringBuilderで文字列の連結ができる


            StringBuilder sb = new StringBuilder();

               sb.append("INSERT");
               sb.append(" INTO GYOMUHOKOKU(");
               sb.append("HOKOKUHIDUKE");
               sb.append(")VALUES(");
               sb.append("?);");

            // sb.toStringで、文字列にする
            // sbのままだと、prepareStatementが受け取れない

            PreparedStatement pStmt = conn.prepareStatement(sb.toString());


            pStmt.setString(1, gyomu.getHokokuhiduke());



            int result = pStmt.executeUpdate();

            StringBuilder sb2 = new StringBuilder();

            //HOKOKUSAKIテーブルのINSERT文の発行



            sb2.append("  INSERT ");
            sb2.append("  INTO HOKOKUSAKI(");
            sb2.append("  HOKOKUSAKISEQ");
            sb2.append("  , STETUSID = ?");
            sb2.append("  , USERID = ?");
            sb2.append("  , HOKOKUSAKINAME = ?");
            sb2.append("  , CREATEDATE = ?");
            sb2.append("  , CREATEUSER = ?");
            sb2.append("  , UPDATEDATE = ?");
            sb2.append("  , UPDATEUSER = ?");
            sb2.append(")");
            sb2.append("VALUES ( ");
            sb2.append("  ( ");
            sb2.append("  SELECT");
            sb2.append("  coalesce(MAX(HOKOKUSAKISEQ), '0') + 1 ");
            sb2.append("  FROM");
            sb2.append("  HOKOKUSAKI");
            sb2.append("  ) ");
            sb.append("  ,?");
            sb.append("  ,?");
            sb.append("  ,?");
            sb.append("  ,?");
            sb.append("  ,?");
            sb.append("  ,?");
            sb.append("  ,?");
            sb2.append(");");

            PreparedStatement pStmt2 = conn.prepareStatement(sb2.toString());
            // INSERT文中の「?」に使用する値を設定し、SQLを完成

            pStmt2.setString(1, gyomu.getStetusid());
            pStmt2.setString(2, gyomu.getUserId());
            pStmt2.setString(3, gyomu.getHokokusakiname());
            pStmt2.setString(4, gyomu.getCreatedate());
            pStmt2.setString(5, gyomu.getCreateuser());
            pStmt2.setString(6, gyomu.getUpdatedate());
            pStmt2.setString(7, gyomu.getUpdateuser());

            // INSERT文を実行

            int result2 = pStmt2.executeUpdate();

            if (result != 1 && result2 != 1) {
                conn.rollback();
                return false;
            }

            conn.commit();

        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        } finally {
            connectManager.close(conn);

        }

        return false;

    }
package dto;

public class Gyomu {

    private String kanrino;
    private String stetusid;
    private String stetusname;
    private String hokokuhiduke;
    private String yotei;
    private String userId;
    private String username;
    private String hokokusakiseq;
    private String hokokusakiname;
    private String zisseki;
    private String tokkizikou;
    private String shokan;
    private String kakunosaki;
    private String zikaiyotei;
    private String komento;
    private String biko;
    private String createdate;
    private String createuser;
    private String updatedate;
    private String updateuser;

    public String getKanrino() {
        return kanrino;
    }
    public void setKanrino(String kanrino) {
        this.kanrino = kanrino;
    }
    public String getStetusid() {
        return stetusid;
    }
    public void setStetusid(String stetusid) {
        this.stetusid = stetusid;
    }
    public String getStetusname() {
        return stetusname;
    }
    public void setStetusname(String stetusname) {
        this.stetusname = stetusname;
    }
    public String getHokokuhiduke() {
        return hokokuhiduke;
    }
    public void setHokokuhiduke(String hokokuhiduke) {
        this.hokokuhiduke = hokokuhiduke;
    }
    public String getYotei() {
        return yotei;
    }
    public void setYotei(String yotei) {
        this.yotei = yotei;
    }
    public String getUserId() {
        return userId;
    }
    public void setUserId(String userId) {
        this.userId = userId;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getHokokusakiseq() {
        return hokokusakiseq;
    }
    public void setHokokusakiseq(String hokokusakiseq) {
        this.hokokusakiseq = hokokusakiseq;
    }
    public String getHokokusakiname() {
        return hokokusakiname;
    }
    public void setHokokusakiname(String hokokusakiname) {
        this.hokokusakiname = hokokusakiname;
    }
    public String getZisseki() {
        return zisseki;
    }
    public void setZisseki(String zisseki) {
        this.zisseki = zisseki;
    }
    public String getTokkizikou() {
        return tokkizikou;
    }
    public void setTokkizikou(String tokkizikou) {
        this.tokkizikou = tokkizikou;
    }
    public String getShokan() {
        return shokan;
    }
    public void setShokan(String shokan) {
        this.shokan = shokan;
    }
    public String getKakunosaki() {
        return kakunosaki;
    }
    public void setKakunosaki(String kakunosaki) {
        this.kakunosaki = kakunosaki;
    }
    public String getZikaiyotei() {
        return zikaiyotei;
    }
    public void setZikaiyotei(String zikaiyotei) {
        this.zikaiyotei = zikaiyotei;
    }
    public String getKomento() {
        return komento;
    }
    public void setKomento(String komento) {
        this.komento = komento;
    }
    public String getBiko() {
        return biko;
    }
    public void setBiko(String biko) {
        this.biko = biko;
    }
    public String getCreatedate() {
        return createdate;
    }
    public void setCreatedate(String createdate) {
        this.createdate = createdate;
    }
    public String getCreateuser() {
        return createuser;
    }
    public void setCreateuser(String createuser) {
        this.createuser = createuser;
    }
    public String getUpdatedate() {
        return updatedate;
    }
    public void setUpdatedate(String updatedate) {
        this.updatedate = updatedate;
    }
    public String getUpdateuser() {
        return updateuser;
    }
    public void setUpdateuser(String updateuser) {
        this.updateuser = updateuser;
    }

}
CREATE TABLE "SYSTEM"."GYOMUHOKOKU" 
   (    "KANRINO" NUMBER GENERATED ALWAYS AS IDENTITY MINVALUE 1 MAXVALUE 99999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER  NOCYCLE  NOKEEP  NOSCALE  NOT NULL ENABLE, 
    "HOKOKUHIDUKE" DATE, 
    "YOTEI" NVARCHAR2(1000), 
    "ZISSEKI" NVARCHAR2(1000), 
    "TOKKIZIKOU" NVARCHAR2(1000), 
    "SHOKAN" NVARCHAR2(1000), 
    "KAKUNOSAKI" NVARCHAR2(1000), 
    "ZIKAIYOTEI" NVARCHAR2(1000), 
    "KOMENTO" NVARCHAR2(1000), 
    "BIKO" NVARCHAR2(1000), 
    "CREATEDATE" DATE, 
    "CREATEUSER" NVARCHAR2(10), 
    "UPDATEDATE" DATE, 
    "UPDATEUSER" NVARCHAR2(10), 
     CONSTRAINT "GYOMUHOKOKU_PKC" PRIMARY KEY ("KANRINO")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "SYSTEM"  ENABLE
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "SYSTEM"
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

コードは実行できる最低限のものを提示するのが質問する側のマナーです。
HOKOKUHIDUKE 列のデータ型を明示するためにも質問にCREATE TABLE文を提示してください。
DATE型なら TO_DATE('?', 'YYYYMMDD') などの記述が必要です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/27 20:58

    申し訳ありません。追記しました。

    キャンセル

  • 2018/07/27 21:13

    まず、SYSTEMスキーマにユーザ側のテーブルを作ってはなりません。
    ちゃんとCREATE USER 必要なGRANTをしたスキーマを用意しましょう。
    Oracleのバージョンは明記しましょう。
    SELECT * FROM V$VERSION;
    >DATE型なら TO_DATE('?', 'YYYYMMDD') などの記述が必要です。
    は試す気がありますか?

    新しい機能はバグが付きまとうのはOracleに限らずソフトウェアの常識ですから、オラクル・サポートにパッチがないか確認しましょう。 GENERATED ALWAYS AS... がない別テーブルを用意して
    INSERT INTO GYOMUHOKOKU(KANRINO, HOKOKUHIDUKE) VALUES(100, TO_DATE('?', 'YYYYMMDD'));
    で実行したらどうなりますか?

    キャンセル

  • 2018/07/28 00:35

    ログインに失敗して、SYSTEMにしか入れなくて、ユーザ側のテーブルを作ってしまいました。
    CREATE USERをしても、テーブルが作成できず、そのままの状態になっています。

    キャンセル

  • 2018/07/28 00:36

    今、帰宅したので、明日試します。ありがとうございます。

    キャンセル

  • 2018/07/28 01:06

    sb.append("INSERT");
    sb.append(" INTO GYOMUHOKOKU(");
    sb.append(" HOKOKUHIDUKE");
    sb.append(" TO_DATE('?', 'YYYY/MM/DD');");

    列索引が無効ですと出ました。

    キャンセル

  • 2018/07/28 01:09

    ? の設定値は?
    GENERATED ALWAYS AS... がない別テーブルを用意して
    INSERT INTO GYOMUHOKOKU(KANRINO, HOKOKUHIDUKE) VALUES(100, TO_DATE('?', 'YYYYMMDD'));
    で実行しては?

    キャンセル

  • 2018/07/28 18:22

    ? の設定値は何ですか。
    現象を再現できる最小限のコードを載せるのが掲示板でのマナーです。
    それに合わせて書式マスクが 'YYYYMMDD' だったり、'YYYY/MM/DD' など変わりますが、認識されていますか?

    キャンセル

  • 2018/07/28 19:22 編集

    認識できていませんでした。
    私の質問だけでは、現象を再現できないですね。
    java⇒?は、 String型
    Oracle⇒DATE型 です。

    キャンセル

  • 2018/07/28 19:25

    だから、 TO_DATEで文字列をDATE型に変換するんです。

    キャンセル

+1

SQLException:列索引が無効です。

上記は、「java.sql.SQLException: 列索引が無効です。」というエラーで、パラメータを正しく設定できていない時に発生します。

sb.append("INSERT");
sb.append(" INTO GYOMUHOKOKU( ");
sb.append(" HOKOKUHIDUKE");
sb.append(" )VALUES(");
sb.append(" '?'); ");


上記実行時に?部分のパラメータは設定していますか?
設定している場合、対応する項目はdate型ですから、日付書式の文字型('2017/07/27'など)を与える必要があります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/28 00:31

    デバックしているときに、パラメータが2017/07/27になっているのを確認しているのですが,
    うまくINSERTできませんでした。

    キャンセル

  • 2018/07/28 00:34

    sbの内容が出力できますか?

    キャンセル

  • 2018/07/28 00:38

    どうすればいいのでしょうか?なにもわかんなくてすみません。

    キャンセル

  • 2018/07/28 00:45

    開発環境も分からないのでなんとも言えませんが、デバッグはできるんですよね?
    出来ないなら、先ずはそこから調べてやらないと、先に進めないと思います。

    キャンセル

  • 2018/07/28 00:48

    デバックはできます!

    キャンセル

  • 2018/07/28 00:57

    環境については詳しくないのでお役には立てそうにありませんが、
    TO_DATE('?', 'YYYY/MM/DD')としてみてはどうでしょうか。

    キャンセル

  • 2018/07/28 01:05

    sb.append("INSERT");
    sb.append(" INTO GYOMUHOKOKU(");
    sb.append(" HOKOKUHIDUKE");
    sb.append(" TO_DATE('?', 'YYYY/MM/DD');");

    列索引が無効ですと出ました。。。。

    キャンセル

  • 2018/07/28 02:16

    結局バインド変数の設定に失敗している感じなのでもう少しコードの範囲を広げて、質問に追記されて下さい。

    キャンセル

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

  • ただいまの回答率 90.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    明解Java入門編演習9−3

    この演習はDayクラスを使わずに行う演習なのでしょうか? Dayクラスを使うのなら、銀行口座クラスにtoStringメソッドを作る理由が分かりません。 また、もしDayクラスを

  • 解決済

    綺麗なコードの書き方を教えてください

    requestを見てSEND_REQUESTの場合にsend dataを行う以下の様なプログラムがあります。 /* NON_REQUEST = 0x0101

  • 受付中

    javaからMysqlに更新の処理を行いたい

    javaからMysqlを操作するやり方について質問です。 現在jspの入力フォームに入力した情報を使ってMysqlへ登録、更新の処理を行うコードを作成中なのですが、登録の処理

  • 解決済

    java 記号文字のエスケープ処理について

    前提・実現したいこと javaで禁則文字チェックを作成しています。 禁則文字はプロパティで保持し、javaで取得した際にエスケープが必要な文字が含まれていた場合は その文

  • 解決済

    toString()メソッドのうまい書き方がわかりません。

    簡単な単方向連結リストの実装をしてみたのですが、toStringメソッドがうまく書けないで、困っています。 どのように記述するのがベストだと思われますか? public c

  • 解決済

    Springでpropertiesファイルが切り替えられない

    前提・実現したいこと 開発と本番でyml形式のプロパティファイルを切り替えたいです 発生している問題・エラーメッセージ どうしても後段のqaのプロパティになってしまい、プ

  • 解決済

    Javaメソッド

    引数で指定した数だけ草を生やして文字列として返す関数 kusa を作成する 以下のコードをもっと素直に書く方法としてはどんなものがあるのか知りたいです よろしくお願いします

  • 解決済

    Javaで人数を編集したい

    現在Javaで開発をしています。 ある項目の人数の編集をしたいのですがどのようなコードを書けばいいか困っています。 仕様は以下です。 1. checkがtrueの

同じタグがついた質問を見る

  • Oracle

    601questions

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