質問編集履歴

2

追記

2020/11/30 11:11

投稿

net-ohkubo
net-ohkubo

スコア7

test CHANGED
File without changes
test CHANGED
@@ -230,6 +230,12 @@
230
230
 
231
231
  6.ユーザA側でpkg_oyaを実行(子パッケージのコード88が返却される)
232
232
 
233
+ 7.ユーザAで親パッケージ(pkg_oya)をリコンパイルし、再度ユーザBへ権限設定
234
+
235
+ 8.ユーザB側でpkg_oyaを実行(子パッケージのコード88が返却される)(元に戻る)
236
+
237
+
238
+
233
239
 
234
240
 
235
241
  なお、該当の変数iを子パッケージから除去すると、

1

追記

2020/11/30 11:11

投稿

net-ohkubo
net-ohkubo

スコア7

test CHANGED
File without changes
test CHANGED
@@ -55,3 +55,185 @@
55
55
  ・pkg1とpkg2をネスト構造にせず1パッケージにまとめる
56
56
 
57
57
  等を検討しております。
58
+
59
+
60
+
61
+ (11/30追記)
62
+
63
+ その後、INVALIDになる原因と対処については実施済となり
64
+
65
+ pkg2だけがリコンパイルされる事例は排除したのですが、
66
+
67
+
68
+
69
+ 上述の、pkg1とpkg2について
70
+
71
+  pkg1:VALID
72
+
73
+  pkg2:VALID (こちらを後からコンパイルした)
74
+
75
+ と両方VALIDになっているにもかかわらず、
76
+
77
+ 別ユーザBからのpkg1実行がpkg2を呼び出せずに終了してしまう、
78
+
79
+ という動作の要因が良く理解できていないままとなっておりました。
80
+
81
+
82
+
83
+ そこで以下のようなサンプルを用いてテストをしていたところ、
84
+
85
+ (結論はコードが悪いに尽きるのですが…)
86
+
87
+ 子パッケージのほうに未使用の変数(i)がありそれが悪さをしていたようです。
88
+
89
+
90
+
91
+ ```PLSQL
92
+
93
+ /* 親パッケージ */
94
+
95
+ create or replace package pkg_oya as
96
+
97
+ type VARARRAY is table of varchar2(2000) index by binary_integer;
98
+
99
+ i binary_integer;
100
+
101
+ procedure spr_oya ( i_cd in number,
102
+
103
+ sts out number);
104
+
105
+ End pkg_oya;
106
+
107
+ /
108
+
109
+ create or replace package body pkg_oya as
110
+
111
+ procedure spr_oya ( i_cd in number,
112
+
113
+ sts out number) is
114
+
115
+ begin
116
+
117
+ /* 子パッケージ呼出し 子からsts=88を受け取る */
118
+
119
+ pkg_ko.spr_ko( i_cd, sts );
120
+
121
+
122
+
123
+ if sts = 88 then
124
+
125
+ sts := 88;
126
+
127
+ else
128
+
129
+ sts := 0;
130
+
131
+ end if;
132
+
133
+ exception
134
+
135
+ when others then
136
+
137
+ sts := 99;
138
+
139
+ end spr_oya;
140
+
141
+ End pkg_oya;
142
+
143
+ /
144
+
145
+ ```
146
+
147
+ ```PLSQL
148
+
149
+ /* 子パッケージ */
150
+
151
+ create or replace package pkg_ko as
152
+
153
+ i BINARY_INTEGER;
154
+
155
+
156
+
157
+ Procedure spr_ko
158
+
159
+ (i_cd in number,
160
+
161
+ sts in out number);
162
+
163
+ End pkg_ko;
164
+
165
+ /
166
+
167
+ create or replace package body pkg_ko is
168
+
169
+ Procedure spr_ko
170
+
171
+ (i_cd in number,
172
+
173
+ sts in out number) is
174
+
175
+ Begin
176
+
177
+ sts := 88;
178
+
179
+ goto end_proc;
180
+
181
+
182
+
183
+ << abort_proc >>
184
+
185
+
186
+
187
+ << end_proc >>
188
+
189
+ null;
190
+
191
+ End spr_ko;
192
+
193
+ End;
194
+
195
+ /
196
+
197
+ ```
198
+
199
+
200
+
201
+ 確認手順
202
+
203
+ 1.ユーザAで親パッケージ(pkg_oya)、子パッケージ(pkg_ko)を定義
204
+
205
+ 2.ユーザB向けにGRANT EXECUTE(pkg_oyaのみ付与。)
206
+
207
+ 3.ユーザB側でpkg_oyaを実行(例えば以下で実行すれば子パッケージのコード88が返却される)
208
+
209
+ ```
210
+
211
+ DECLARE
212
+
213
+ i_cd NUMBER := 1234;
214
+
215
+ o_data NUMBER;
216
+
217
+ BEGIN
218
+
219
+ pkg_oya.spr_oya(i_cd,o_data);
220
+
221
+ DBMS_OUTPUT.PUT_LINE(o_data);
222
+
223
+ END;
224
+
225
+ ```
226
+
227
+ 4.その後、ユーザAで子パッケージ(pkg_ko)をリコンパイル
228
+
229
+ 5.ユーザB側でpkg_oyaを実行(子パッケージ部でExceptionになりコード99が返却される)
230
+
231
+ 6.ユーザA側でpkg_oyaを実行(子パッケージのコード88が返却される)
232
+
233
+
234
+
235
+ なお、該当の変数iを子パッケージから除去すると、
236
+
237
+ 上述の子パッケージをコンパイルしても、上述の5.
238
+
239
+ の実行結果は子パッケージ呼出し時にExceptionにならず、88が返却されました。