質問編集履歴

3

ソース記載

2016/12/21 14:46

投稿

tatatatao
tatatatao

スコア6

test CHANGED
File without changes
test CHANGED
@@ -26,60 +26,138 @@
26
26
 
27
27
  ###現行ソース(抜粋)
28
28
 
29
+
30
+
31
+ ```PL/SQL
32
+
33
+ CREATE OR REPLACE procedure
34
+
35
+ XX.ABC(
36
+
37
+ DB_LINK_NM varchar2(384);
38
+
39
+ ) as
40
+
41
+
42
+
43
+ --差分取得カーソル変数
44
+
29
45
  cursol A
30
46
 
31
- is
47
+ is
32
48
 
33
- select
49
+ select a,b,c
34
-
35
- a,b,c
36
50
 
37
51
  from TBL_A
38
52
 
39
- minus
53
+ minus
40
54
 
41
- select
55
+ select a,b,c
42
-
43
- a,b,c
44
56
 
45
57
  from TBL_B;
46
58
 
47
59
 
48
60
 
49
- for rec into A
61
+ --更新処理
50
62
 
51
- loop ……
63
+ procedure UPDATE_MST(
52
64
 
53
- 〜更新処理〜
65
+ rec in A%ROWTYPE;
54
66
 
67
+ ) as
68
+
69
+ update TBL_A
70
+
71
+ set A = REC.a,
72
+
73
+ B = REC.b
74
+
75
+ where C = REC.c
76
+
77
+ end UPDATE_MST;
78
+
79
+
80
+
81
+ begin
82
+
83
+ --差分取得してLOOP
84
+
85
+ for REC in A loop
86
+
87
+ --更新処理
88
+
89
+ UPDATE_MST(REC);
90
+
55
- loop end;
91
+ end loop;
92
+
93
+ ...
94
+
95
+
96
+
97
+
98
+
99
+ ```
56
100
 
57
101
 
58
102
 
59
103
  ###改修案(抜粋)
60
104
 
105
+ ```PL/SQL
61
106
 
107
+ CREATE OR REPLACE procedure
62
108
 
63
- WSSQL := '';
109
+ YY.ABC(
64
110
 
65
- WSSQL := WSSQL ∣∣ 'select a,b,c from TBL_A';
111
+ DB_LINK_NM varchar2(384);
66
112
 
67
- WSSQL := WSSQL ∣∣ 'minus';
113
+ ) as
68
-
69
- WSSQL := WSSQL ∣∣ 'select a,b,c from TBL_B@';
70
-
71
- WSSQL := ∣∣ dblinknm(DBLINK名変数);
72
114
 
73
115
 
74
116
 
75
- open cur_cv(定義済) for WSSQL
117
+ --変数定義
76
118
 
119
+ SQL varchar2(1000);
120
+
121
+ TYPE cv_type IS REF CURSOL;
122
+
123
+ cur_cv cv_type;
124
+
125
+
126
+
127
+ --差分取得SQL作成処理
128
+
129
+ procedure CERATE_GET_DIF_SQL
130
+
131
+ as
132
+
133
+ WSSQL varchar2(1000);
134
+
135
+ begin
136
+
137
+ WSSQL := '';
138
+
139
+ WSSQL := WSSQL ∣∣ 'select a,b,c from TBL_A';
140
+
141
+ WSSQL := WSSQL ∣∣ 'minus';
142
+
143
+ WSSQL := WSSQL ∣∣ 'select a,b,c from TBL_B@';
144
+
145
+ WSSQL := ∣∣ DB_LINK_NM ; --◆ここで更新先テーブルのDBリンク名を結合
146
+
147
+
148
+
149
+ open cur_cv for WSSQL
150
+
77
- loop fetch cur_cv into REC定義済
151
+ loop fetch cur_cv into REC(定義済変数とする)
78
152
 
79
153
  exit cur_cv%NOTFOUND;
80
154
 
81
- 〜更新処理〜
155
+ --〜更新処理(更新先DBをDBリンク名で指定して更新)
82
156
 
83
157
  end loop;
84
158
 
85
159
  close cur_cv;
160
+
161
+ ...
162
+
163
+ ```

2

2016/12/21 14:46

投稿

tatatatao
tatatatao

スコア6

test CHANGED
File without changes
test CHANGED
@@ -1,16 +1,22 @@
1
1
  ###前提・実現したいこと
2
2
 
3
- Database linkを使用して、更新先のサーバを動的に制御する必要があります。
3
+ Database linkを使用して、更新先のDBを動的に制御する必要があります。
4
+
5
+ まずは送信元DBと更新先DBの差を取得し、差があれば更新先DBを更新します。
4
6
 
5
7
 
6
8
 
7
- 現行は1つのサーバから1つのサーバへデータ連携していたので、カーソル宣言をして、暗黙カーソルオープンされてました。
9
+ 現行は1つのサーバから1つのサーバへデータ連携していたので、差分取得の際、カーソル宣言をして、暗黙カーソルオープンされてました。
8
10
 
9
11
  改修するにあたり、1つのサーバから複数のサーバへデータ連携する必要が出てきました。
10
12
 
11
13
  そこでDBLINKを使用するのですが、テーブルを動的にするとなると、OPENしてFETCHすることが避けられない(と思っています)ようで、現行の処理を大幅に変更する必要がありますが、それを避けたいです。
12
14
 
13
15
 
16
+
17
+
18
+
19
+ ------------------
14
20
 
15
21
  ご回答ありがとうございます。
16
22
 

1

2016/12/21 03:55

投稿

tatatatao
tatatatao

スコア6

test CHANGED
File without changes
test CHANGED
@@ -12,8 +12,68 @@
12
12
 
13
13
 
14
14
 
15
+ ご回答ありがとうございます。
16
+
17
+ ソースの参考を貼り付けます。
18
+
19
+ スマホからなので、抜粋ですが、宜しくお願い致します。
20
+
21
+ ###現行ソース(抜粋)
22
+
23
+ cursol A
24
+
25
+ is
26
+
27
+ select
28
+
29
+ a,b,c
30
+
31
+ from TBL_A
32
+
33
+ minus
34
+
35
+ select
36
+
37
+ a,b,c
38
+
39
+ from TBL_B;
15
40
 
16
41
 
17
- ###発生している問題・エラーメッセージ
18
42
 
43
+ for rec into A
44
+
45
+ loop ……
46
+
47
+ 〜更新処理〜
48
+
49
+ loop end;
50
+
51
+
52
+
53
+ ###改修案(抜粋)
54
+
55
+
56
+
57
+ WSSQL := '';
58
+
19
- OPENしてfetchでもかまいませんが、改修箇所が多くなるため、可能ならば暗黙的に処理したいです。
59
+ WSSQL := WSSQL ∣∣ 'select a,b,c from TBL_A';
60
+
61
+ WSSQL := WSSQL ∣∣ 'minus';
62
+
63
+ WSSQL := WSSQL ∣∣ 'select a,b,c from TBL_B@';
64
+
65
+ WSSQL := ∣∣ dblinknm(DBLINK名変数);
66
+
67
+
68
+
69
+ open cur_cv(定義済) for WSSQL
70
+
71
+ loop fetch cur_cv into REC(定義済)
72
+
73
+ exit cur_cv%NOTFOUND;
74
+
75
+ 〜更新処理〜
76
+
77
+ end loop;
78
+
79
+ close cur_cv;