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

質問編集履歴

3

ソース記載

2016/12/21 14:46

投稿

tatatatao
tatatatao

スコア6

title CHANGED
File without changes
body CHANGED
@@ -12,32 +12,71 @@
12
12
  ソースの参考を貼り付けます。
13
13
  スマホからなので、抜粋ですが、宜しくお願い致します。
14
14
  ###現行ソース(抜粋)
15
+
16
+ ```PL/SQL
17
+ CREATE OR REPLACE procedure
18
+ XX.ABC(
19
+ DB_LINK_NM varchar2(384);
20
+ ) as
21
+
22
+ --差分取得カーソル変数
15
23
  cursol A
16
- is
24
+ is
17
- select
25
+ select a,b,c
18
- a,b,c
19
26
  from TBL_A
20
- minus
27
+ minus
21
- select
28
+ select a,b,c
22
- a,b,c
23
29
  from TBL_B;
24
30
 
25
- for rec into A
26
- loop ……
27
- 更新処理
31
+ --更新処理
32
+ procedure UPDATE_MST(
33
+ rec in A%ROWTYPE;
34
+ ) as
35
+ update TBL_A
36
+ set A = REC.a,
28
- loop end;
37
+ B = REC.b
38
+ where C = REC.c
39
+ end UPDATE_MST;
29
40
 
41
+ begin
42
+ --差分取得してLOOP
43
+ for REC in A loop
44
+ --更新処理
45
+ UPDATE_MST(REC);
46
+ end loop;
47
+ ...
48
+
49
+
50
+ ```
51
+
30
52
  ###改修案(抜粋)
53
+ ```PL/SQL
54
+ CREATE OR REPLACE procedure
55
+ YY.ABC(
56
+ DB_LINK_NM varchar2(384);
57
+ ) as
31
58
 
59
+ --変数定義
32
- WSSQL := '';
60
+ SQL varchar2(1000);
33
- WSSQL := WSSQL ∣∣ 'select a,b,c from TBL_A';
34
- WSSQL := WSSQL ∣∣ 'minus';
61
+ TYPE cv_type IS REF CURSOL;
35
- WSSQL := WSSQL ∣∣ 'select a,b,c from TBL_B@';
36
- WSSQL := ∣∣ dblinknm(DBLINK名変数);
62
+ cur_cv cv_type;
37
63
 
64
+ --差分取得SQL作成処理
65
+ procedure CERATE_GET_DIF_SQL
66
+ as
67
+ WSSQL varchar2(1000);
68
+ begin
69
+ WSSQL := '';
70
+ WSSQL := WSSQL ∣∣ 'select a,b,c from TBL_A';
71
+ WSSQL := WSSQL ∣∣ 'minus';
72
+ WSSQL := WSSQL ∣∣ 'select a,b,c from TBL_B@';
73
+ WSSQL := ∣∣ DB_LINK_NM ; --◆ここで更新先テーブルのDBリンク名を結合
74
+
38
- open cur_cv(定義済) for WSSQL
75
+ open cur_cv for WSSQL
39
- loop fetch cur_cv into REC定義済
76
+ loop fetch cur_cv into REC(定義済変数とする)
40
77
  exit cur_cv%NOTFOUND;
41
- 〜更新処理〜
78
+ --〜更新処理(更新先DBをDBリンク名で指定して更新)
42
79
  end loop;
43
- close cur_cv;
80
+ close cur_cv;
81
+ ...
82
+ ```

2

2016/12/21 14:46

投稿

tatatatao
tatatatao

スコア6

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

1

2016/12/21 03:55

投稿

tatatatao
tatatatao

スコア6

title CHANGED
File without changes
body CHANGED
@@ -5,6 +5,36 @@
5
5
  改修するにあたり、1つのサーバから複数のサーバへデータ連携する必要が出てきました。
6
6
  そこでDBLINKを使用するのですが、テーブルを動的にするとなると、OPENしてFETCHすることが避けられない(と思っています)ようで、現行の処理を大幅に変更する必要がありますが、それを避けたいです。
7
7
 
8
+ ご回答ありがとうございます。
9
+ ソースの参考を貼り付けます。
10
+ スマホからなので、抜粋ですが、宜しくお願い致します。
11
+ ###現行ソース(抜粋)
12
+ cursol A
13
+ is
14
+ select
15
+ a,b,c
16
+ from TBL_A
17
+ minus
18
+ select
19
+ a,b,c
20
+ from TBL_B;
8
21
 
22
+ for rec into A
23
+ loop ……
24
+ 〜更新処理〜
25
+ loop end;
26
+
27
+ ###改修案(抜粋)
28
+
29
+ WSSQL := '';
30
+ WSSQL := WSSQL ∣∣ 'select a,b,c from TBL_A';
31
+ WSSQL := WSSQL ∣∣ 'minus';
32
+ WSSQL := WSSQL ∣∣ 'select a,b,c from TBL_B@';
33
+ WSSQL := ∣∣ dblinknm(DBLINK名変数);
34
+
35
+ open cur_cv(定義済) for WSSQL
36
+ loop fetch cur_cv into REC(定義済)
9
- ###発生している問題・エラーメッセージ
37
+ exit cur_cv%NOTFOUND;
38
+ 〜更新処理〜
39
+ end loop;
10
- OPENしてfetchでもかまいませんが、改修箇所が多くなるため、可能ならば暗黙的に処理したいです。
40
+ close cur_cv;