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

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

ただいまの
回答率

90.32%

  • Oracle

    618questions

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

INSERT文のエラーについて

受付中

回答 2

投稿 編集

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

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

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

    キャンセル

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

  • Oracle

    618questions

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