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

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

ただいまの
回答率

88.11%

2つの違うテーブルに同じ値をINSERTする方法

解決済

回答 1

投稿 編集

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

score 40

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

        boolean flag = false;

        Connection conn = null;

        try {

            conn = connectManager.getConn(false);

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

            //業務報告テーブルのUPDATE
            StringBuilder sb = new StringBuilder();
            sb.append("UPDATE");
            sb.append(" GYOMUHOKOKU");
            sb.append(" SET");
            sb.append(" HOKOKUHIDUKE = ?");
            sb.append(" , YOTEI = ?");
            sb.append(" , ZISSEKI = ?");
            sb.append(" , TOKKIZIKOU = ?");
            sb.append(" , SHOKAN = ?");
            sb.append(" , KAKUNOSAKI = ?");
            sb.append(" , ZIKAIYOTEI = ?");
            sb.append(" , KOMENTO = ?");
            sb.append(" , BIKO = ?");
            sb.append(" , CREATEDATE = ?");
            sb.append(" , CREATEUSER = ?");
            sb.append(" , UPDATEDATE = ?");
            sb.append(" , UPDATEUSER = ?");
            sb.append(" WHERE KANRINO = ?");


            StringBuilder sb2 = new StringBuilder();

            sb2.append("UPDATE");
            sb2.append(" HOKOKUSAKI");
            sb2.append(" SET");
            sb2.append(" USERID = ?");
            sb2.append(" , CREATEDATE = ?");
            sb2.append(" , CREATEUSER = ?");
            sb2.append(" , UPDATEDATE = ?");
            sb2.append(" , UPDATEUSER = ?");
            sb2.append(" WHERE KANRINO = ?");


            // sb.toStringで、文字列にする
            // sbのままだと、prepareStatementが受け取れない
             PreparedStatement pStmt = conn.prepareStatement(sb.toString());
             PreparedStatement pStmt2 = conn.prepareStatement(sb2.toString());

            // UPDATE文中の「?」に使用する値を設定し、SQLを完成


             //報告先seqに値が入るようにする


            pStmt.setString(1, gyomu.getHokokuhiduke());
            pStmt.setString(2, gyomu.getYotei());
            pStmt.setString(3, gyomu.getZisseki());
            pStmt.setString(4, gyomu.getTokkizikou());
            pStmt.setString(5, gyomu.getShokan());
            pStmt.setString(6, gyomu.getKakunosaki());
            pStmt.setString(7, gyomu.getZikaiyotei());
            pStmt.setString(8, gyomu.getKomento());
            pStmt.setString(9, gyomu.getBiko());
            pStmt.setString(10, gyomu.getCreatedate());
            pStmt.setString(11, gyomu.getCreateuser());
            pStmt.setString(12, gyomu.getUpdatedate());
            pStmt.setString(13, gyomu.getUpdateuser());
            pStmt.setString(14, gyomu.getKanrino());

            //ステータステーブルのUPDATE

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

            // INSERT文を実行
            int result = pStmt.executeUpdate();
            int result2 = pStmt2.executeUpdate();


            if (result == 1 && result2 == 1) {
                // 1件更新されたら正常
                conn.commit();
                flag = true;
            } else {
                conn.rollback();
            }

        } catch (SQLException e) {
            e.printStackTrace();
            try {
                conn.rollback();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        } finally {
            connectManager.close(conn);
        }

        return flag;
    }
 create table 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 VARCHAR2(5)
  , UPDATEDATE DATE
  , UPDATEUSER NVARCHAR2(5)
  , constraint GYOMUHOKOKU_PKC primary key (KANRINO)
)
   create table HOKOKUSAKI (
  KANRINO  NUMBER(5) NOT NULL
  , HOKOKUSAKISEQ NUMBER(5) NOT NULL
  , STETUSID CHAR(2) not null
  , USERID VARCHAR2(5) not null
  , CREATEDATE DATE
  , CREATEUSER VARCHAR2(5)
  , UPDATEDATE DATE
  , UPDATEUSER VARCHAR2(5)
  , primary key (KANRINO))


上記のGYOMUHOKOKUテーブルに管理Noが自動的に採番されますが、
HOKOKUSAKIテーブルにGYOMUHOKOKUテーブルの値を入力するためにはどうしたらいいのでしょうか。先輩に、INSERT文を発行したときに、return?するように書いてと言われました。javaで実現したいのですが、難しすぎてわからないので、教えていただけないでしょうか。

ヒントだけもらって、Statement.RETURN_GENERATED_KEYSを使うといわれました。

流れとしては、
①GYOMUHOKOKUにINSERTする。
②INSERTした結果をもとに、HOKOKUSAKIテーブルにINSERTする。だと思っています。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • Orlofsky

    2018/07/31 05:27

    質問の内容から判断して、タイトルを[INSERT結果を取得する]に変えては?

    キャンセル

回答 1

checkベストアンサー

0

そろそろマニュアルを確認する習慣を身に付けましょう。
SQL言語リファレンス INSERT

INSERT INTO employees 
      (employee_id, last_name, email, hire_date, job_id, salary)
   VALUES 
   (employees_seq.nextval, 'Doe', 'john.doe@example.com', 
       SYSDATE, 'SH_CLERK', 2400) 
   RETURNING salary*12, job_id INTO :bnd1, :bnd2;


を参考に。
SQLでできることはSQL内で完結させた方がパフォーマンスが良いことが多いです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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