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

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

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

MySQL Workbenchは、オープンソースのデータベースモデリングツールです。ビジュアルなデータベース設計・SQL開発・サーバー設定・ユーザー管理・バックアップといった様々な管理ツールを備えます。

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

teratail

teratail(テラテイル)は、プログラミングに特化した日本語Q&Aサイトです。

Q&A

解決済

2回答

4801閲覧

MYSQLストアドプロシージャでレコードを一つづつ読んで条件分岐したい

s_ayana

総合スコア35

MySQL Workbench

MySQL Workbenchは、オープンソースのデータベースモデリングツールです。ビジュアルなデータベース設計・SQL開発・サーバー設定・ユーザー管理・バックアップといった様々な管理ツールを備えます。

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

teratail

teratail(テラテイル)は、プログラミングに特化した日本語Q&Aサイトです。

0グッド

0クリップ

投稿2018/01/19 06:10

ややこしい質問なので、順を追って説明いたします。
現在、アップロードされたファイルを読んで、そのファイルのファイル名や転送番号をテーブルに入れる処理をしています。
続いてMYSQLworkbenchにストアドプロシージャを作って、ShellでそのMYSQLに接続します。
そのときファイルの転送番号が1から2に変わったとき別パスにコピーを実行します。
conect/sample→conect/file1に変えてコピー
ここまではShellで作成できました。

続いてなのですが、今度はMYSQLプロシージャでの作成ですが転送番号2に変わったカラムの中のものを今度はCSVに出力して、そのあと2から3に変更します。
ソース
DELIMITER $$

DROP PROCEDURE IF EXISTS testproc1$$

CREATE PROCEDURE testproc1(OUT param int(3) zerofill)
BEGIN
DECLARE done INT;
DECLARE CONTINUE HANDLER FOR SQLSTATE '21000' SET done = 1;

SET param = 001;
SET @num=(SELECT table1 FROM colum1);
SET @path=(select nm3 from system where Key2 = 2);

IF @num=2 THEN

SET @query = CONCAT('SELECT * FROM table1 INTO OUTFILE ',"'", @path ,"'",' FIELDS TERMINATED BY ","');

PREPARE getExtends FROM @query;
EXECUTE getExtends;
DEALLOCATE PREPARE getExtends;

SET SQL_SAFE_UPDATES = 0;
update table1 set colum1=3 where colum1=2;

END IF;

select * from table1;

END$$

DELIMITER ;

ソース2
call testproc1();

これだとSET @num=(SELECT table1 FROM colum1);のとこでサブクエリエラーが出てしまいます。
全部のカラムのレコードを代入しようとすると変数は一つのレコードしか代入できません。ということになってしまいます。
ただこれだと一つの転送番号2しかcsvレコード出力できず、一つのレコードしか2から3に変更できません。
なので、上からレコードを読んで上から全部の2比較する条件分岐をしたいです。
テーブルイメージ
|id| ファイル名 | 転送番号|path|
| 1 |sample1   | 2 |conect/file1 |
| 2 | sample2   |   1 | conect/file2 |
| 3|sample3   | 2 |conect/file3 |
| 4 | sample4 | 3 |conect/file4 |
| 5|sample5   | 2 |conect/file5 |

・・条件分岐してまたは(カーソル、ハンドラ?)で ↓

|id| ファイル名 | 転送番号|path|
| 1 |sample1   | 3 |conect/file1 |
| 2 | sample2   |   1 | conect/file2 |
| 3|sample3   | 3 |conect/file3 |
| 4 | sample4 | 3 |conect/file4 |
| 5|sample5   | 3 |conect/file5 |

と転送番号2のときcsvにレコードを上からcsv出力して2を3に変更したいです。
上記のソースだとサブクエリエラーになってしまうため、分かるかたいたらよろしくお願い致します。

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

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

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

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

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

guest

回答2

0

とりあえず
SET @num=(SELECT table1 FROM colum1);
は、最低でも
SET @num=(SELECT colum1 FROM table1);
でしょうね。(それでも複数データを受ける時点で間違いですが)

別の質問でも指摘されていましたがカーソルについては理解しましたか?
なんか質問を広げるだけ広げて理解しないまま回収できない状態になっていませんか?
カーソルを使うからこそ例外処理とdoneが効いてくるんですけどね

もう一度、質問のしかたを工夫して下さい。

  1. 具体位的にテーブルの構造、データをcreate table、insert intoで記載
  2. そのデータを具体的にどういったデータを出したいか提示
  3. データ更新が必要ならどういう条件でどう更新するか

※それといままでとっちらかした質問を収束して下さい

投稿2018/01/19 07:36

yambejp

総合スコア114572

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

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

0

ベストアンサー

前回の回答と一部同じ回答になってしまいますが・・・

質問内容から仕様を要約すると、

  • 2のレコードをCSVに出力したい
  • 2のレコードを3にしたい
  • 23という値は固定値である

この3点だけだと思われます。
他にも実は3を4にしたいとか、5のときは特別な処理(別のテーブルにINSERTしたい)とかありますか?

ここまで正しいなら、

  • @numに転送番号を取り出す必要はない
  • なぜなら固定値でわかりきっている値だから

ここまで正しいなら、以下の処理を順に実行すればよいだけですね。

  1. 転送番号=2のレコードをCSVに出力する
  2. 転送番号=2のレコードを3にUPDATEする

投稿2018/01/19 07:51

ttyp03

総合スコア16996

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問