teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2018/01/15 09:15

投稿

sk_3122
sk_3122

スコア1126

answer CHANGED
@@ -25,4 +25,90 @@
25
25
  そして、本題の「配列を使いたい」というのはどの部分に関してでしょうか。
26
26
 
27
27
  『 ここでSELECT文発行(略) 』 の結果を配列に入れたい、ということでしょうか?
28
- それとも前述のカーソルの扱いについて何か問題があったのでしょうか。
28
+ それとも前述のカーソルの扱いについて何か問題があったのでしょうか。
29
+
30
+
31
+ # 追記
32
+
33
+ > IF分の中でさらにSELECT文を発行し、WHERE句として使用する
34
+
35
+ この SELECT したものは何に使うのでしょうか。PRINT で確認するだけ?
36
+
37
+ FETCH したものをそのまま判定に使ったり WHERE句 で指定したりするだけなら
38
+ 配列に詰めないで WHILE の中でそのまま処理を書いてしまえば良い気もしますが。
39
+
40
+ 以下 コピペで動くはず・・・
41
+ (2つ目のSELECTは適当です)
42
+ (TAB_A, TAB_B はテスト実行用にサブクエリを書いていますが、実際には普通にテーブルを指定すれば良いです)
43
+ ```sql
44
+ BEGIN
45
+ --カーソルの値を取得する変数宣言
46
+ DECLARE @W_COL1 varchar(50)
47
+ DECLARE @W_COL2 decimal(18,0)
48
+
49
+ --2つ目の SELECT の結果を入れる変数
50
+ DECLARE @W_HOGE varchar(100)
51
+
52
+ --カーソル定義
53
+ DECLARE CUR_AAA CURSOR LOCAL FOR
54
+ SELECT COL1, COL2
55
+ FROM (
56
+ SELECT 'aaa' AS COL1, CONVERT(decimal, 100) AS COL2 UNION ALL
57
+ SELECT 'bbb' AS COL1, CONVERT(decimal, 200) AS COL2 UNION ALL
58
+ SELECT 'ccc' AS COL1, CONVERT(decimal, 300) AS COL2 UNION ALL
59
+ SELECT 'aaa' AS COL1, CONVERT(decimal, 10) AS COL2 UNION ALL
60
+ SELECT 'aaa' AS COL1, CONVERT(decimal, 20) AS COL2
61
+ ) TAB_A
62
+ WHERE TAB_A.COL1 IN ('aaa', 'ccc')
63
+
64
+ --カーソルオープン
65
+ OPEN CUR_AAA;
66
+
67
+ --最初の1行目を取得して変数へ値をセット
68
+ FETCH NEXT FROM CUR_AAA INTO @W_COL1,@W_COL2;
69
+
70
+ --データの行数分ループ処理を実行する
71
+ WHILE @@FETCH_STATUS = 0
72
+ BEGIN
73
+
74
+ -- 確認用
75
+ PRINT 'FETCHしたもの:[' + @W_COL1 + '] [' + CONVERT(varchar, @W_COL2) + ']'
76
+
77
+ -- ★FETCH した値を判定条件に使用
78
+ IF @W_COL1 = 'aaa'
79
+ BEGIN
80
+ -- FETCH した値を元に別テーブルを SELECT
81
+ SELECT @W_HOGE = Hoge
82
+ FROM (
83
+ SELECT 'aaa' AS COL1, CONVERT(decimal, 100) AS COL2, 'hoge1' AS Hoge UNION ALL
84
+ SELECT 'bbb' AS COL1, CONVERT(decimal, 200) AS COL2, 'hoge2' AS Hoge UNION ALL
85
+ SELECT 'ccc' AS COL1, CONVERT(decimal, 300) AS COL2, 'hoge3' AS Hoge UNION ALL
86
+ SELECT 'aaa' AS COL1, CONVERT(decimal, 10) AS COL2, 'hoge4' AS Hoge UNION ALL
87
+ SELECT 'aaa' AS COL1, CONVERT(decimal, 20) AS COL2, 'hoge5' AS Hoge
88
+ ) TAB_B
89
+ WHERE TAB_B.COL1 = @W_COL1 --★WHERE句に使用
90
+ AND TAB_B.COL2 = @W_COL2 --★WHERE句に使用
91
+
92
+ -- 確認用
93
+ PRINT 'Hoge[' + @W_HOGE + ']'
94
+ END
95
+ ELSE
96
+ BEGIN
97
+ -- 確認用
98
+ PRINT '2つ目のSELECTは実行しません'
99
+ END
100
+
101
+ PRINT '----------'
102
+
103
+ --次の行のデータを取得して変数へ値をセット
104
+ FETCH NEXT FROM CUR_AAA INTO @W_COL1,@W_COL2;
105
+ END
106
+
107
+ --カーソルを閉じる
108
+ CLOSE CUR_AAA;
109
+ DEALLOCATE CUR_AAA;
110
+
111
+ END
112
+ ```
113
+
114
+ 参考までに。