質問編集履歴

3

試したことを追加

2018/03/23 05:34

投稿

h.t.0210
h.t.0210

スコア6

test CHANGED
File without changes
test CHANGED
@@ -290,6 +290,10 @@
290
290
 
291
291
  V$OPEN_CURSORを確認したところ、確かに「BEGIN プロシージャ名; END;」というOPENが増幅していました。
292
292
 
293
+ JPAのStoredProcedureQueryを使わずにjava.sql.CallableStatementで呼び出したら、トランザクションの制御を含めてうまくいきましたので、JPA側の問題ではないかと思います。
294
+
295
+ ただ、コードの統一性を考慮して、実装はあくまでJPAで行いたいと考えています。
296
+
293
297
 
294
298
 
295
299
  ### 補足情報(FW/ツールのバージョンなど)

2

コードを少し修正しました

2018/03/23 05:34

投稿

h.t.0210
h.t.0210

スコア6

test CHANGED
File without changes
test CHANGED
@@ -28,58 +28,72 @@
28
28
 
29
29
  ```lang-Java
30
30
 
31
+ try{
32
+
31
- fac = Persistence.createEntityManagerFactory("xxx");
33
+ fac = Persistence.createEntityManagerFactory("xxx");
32
-
34
+
33
- em = fac.createEntityManager();
35
+ em = fac.createEntityManager();
34
-
36
+
35
- tx = em.getTransaction();
37
+ tx = em.getTransaction();
36
-
37
-
38
-
38
+
39
+
40
+
39
- StoredProcedureQuery spq;
41
+ StoredProcedureQuery spq;
40
-
42
+
41
- spq = em.createStoredProcedureQuery("yyyy");
43
+ spq = em.createStoredProcedureQuery("YYYY.ZZZZ");
42
-
44
+
43
- spq.registerStoredProcedureParameter(1, Object.class, ParameterMode.IN);
45
+ spq.registerStoredProcedureParameter(1, Object.class, ParameterMode.IN);
44
-
46
+
45
- spq.registerStoredProcedureParameter(2, Object.class, ParameterMode.IN);
47
+ spq.registerStoredProcedureParameter(2, Object.class, ParameterMode.IN);
46
-
48
+
47
- spq.registerStoredProcedureParameter(3, Short.class, ParameterMode.OUT);
49
+ spq.registerStoredProcedureParameter(3, Short.class, ParameterMode.OUT);
48
-
50
+
49
- spq.registerStoredProcedureParameter(4, Short.class, ParameterMode.OUT);
51
+ spq.registerStoredProcedureParameter(4, Short.class, ParameterMode.OUT);
50
-
52
+
51
- tx.begin();
53
+ tx.begin();
52
-
54
+
53
- for (List<String> rec : csv) {
55
+ for (List<String> rec : csv) {
54
-
56
+
55
- String aa = rec.get(0);
57
+ String aa = rec.get(0);
56
-
58
+
57
- String bb= rec.get(1);
59
+ String bb= rec.get(1);
58
-
60
+
59
- spq.setParameter(1, aa);
61
+ spq.setParameter(1, aa);
60
-
62
+
61
- spq.setParameter(2, bb);
63
+ spq.setParameter(2, bb);
62
-
64
+
63
- // 実行
65
+ // 実行
64
-
66
+
65
- spq.execute();
67
+ spq.execute();
66
-
67
-
68
-
68
+
69
+
70
+
69
- // エラーチェック
71
+ // エラーチェック
70
-
72
+
71
- if(...){
73
+ if(...){
72
-
74
+
73
- tx.rollback();
75
+ tx.rollback();
74
-
76
+
75
- return;
77
+ return;
78
+
79
+ }
76
80
 
77
81
  }
78
82
 
83
+ tx.commit();
84
+
85
+ }catch(Exception e){
86
+
87
+ throw e;
88
+
89
+ }finally{
90
+
91
+ if(em != null)em.close();
92
+
93
+ if(fac != null)fac.close();
94
+
79
95
  }
80
96
 
81
- tx.commit();
82
-
83
97
  ```
84
98
 
85
99
  ```lang-SQL

1

ストアド定義を追加しました。

2018/03/23 02:55

投稿

h.t.0210
h.t.0210

スコア6

test CHANGED
File without changes
test CHANGED
@@ -82,6 +82,194 @@
82
82
 
83
83
  ```
84
84
 
85
+ ```lang-SQL
86
+
87
+ CREATE OR REPLACE PACKAGE YYYY
88
+
89
+ AS
90
+
91
+ /** ステータスコード **/
92
+
93
+ G_RET_NORMAL NUMBER := 0;
94
+
95
+ G_RET_SQLERROR NUMBER := 1;
96
+
97
+ G_RET_PARAMERTER NUMBER := 2;
98
+
99
+ G_RET_DUPLICATION NUMBER := 3;
100
+
101
+ G_RET_NO_EXIST NUMBER := 4;
102
+
103
+
104
+
105
+ /** エラーNO **/
106
+
107
+ G_ERR_NO_SUCCESS NUMBER := 0;
108
+
109
+ G_RET_ERROR NUMBER := 1;
110
+
111
+
112
+
113
+ PROCEDURE ZZZZ
114
+
115
+ (
116
+
117
+ I_AAA IN TABLE_A.AAA%type,
118
+
119
+ I_BBB IN TABLE_A.BBB%type
120
+
121
+ O_STATUS OUT NUMBER,
122
+
123
+ O_ERROR_NO OUT NUMBER
124
+
125
+ );
126
+
127
+ END YYYY;
128
+
129
+ /
130
+
131
+
132
+
133
+ CREATE OR REPLACE PACKAGE BODY YYYY
134
+
135
+ IS
136
+
137
+ PROCEDURE ZZZZ
138
+
139
+ (
140
+
141
+ I_AAA IN TABLE_A.AAA%type,
142
+
143
+ I_BBB IN TABLE_A.BBB%type
144
+
145
+ O_STATUS OUT NUMBER,
146
+
147
+ O_ERROR_NO OUT NUMBER
148
+
149
+ )
150
+
151
+ IS
152
+
153
+ nCOUNT NUMBER := 0;
154
+
155
+ BEGIN
156
+
157
+ /* 入力パラメータチェック */
158
+
159
+ ・・・
160
+
161
+
162
+
163
+ /* データ存在チェック */
164
+
165
+ BEGIN
166
+
167
+ SELECT
168
+
169
+ COUNT(1)
170
+
171
+ INTO
172
+
173
+ nCOUNT
174
+
175
+ FROM
176
+
177
+ TABLE_A
178
+
179
+ WHERE
180
+
181
+ AAA = I_AAA
182
+
183
+ AND BBB = I_BBB
184
+
185
+ ;
186
+
187
+ EXCEPTION
188
+
189
+ WHEN OTHERS THEN
190
+
191
+ O_STATUS := G_RET_SQLERROR;
192
+
193
+ O_ERROR_NO := SQLCODE ;
194
+
195
+ RETURN ;
196
+
197
+ END ;
198
+
199
+ IF nCOUNT > 0 THEN
200
+
201
+ O_STATUS := G_RET_DUPLICATION;
202
+
203
+ O_ERROR_NO := G_RET_ERROR ;
204
+
205
+ RETURN ;
206
+
207
+ END IF;
208
+
209
+
210
+
211
+ /* データ登録 */
212
+
213
+ BEGIN
214
+
215
+ INSERT INTO
216
+
217
+ TABLE_A
218
+
219
+ (
220
+
221
+ AAA,
222
+
223
+ BBB
224
+
225
+ ) VALUES(
226
+
227
+ I_AAA,
228
+
229
+ I_BBB
230
+
231
+ );
232
+
233
+ EXCEPTION
234
+
235
+ WHEN OTHERS THEN
236
+
237
+ O_STATUS := G_RET_SQLERROR;
238
+
239
+ O_ERROR_NO := SQLCODE ;
240
+
241
+ RETURN ;
242
+
243
+ END ;
244
+
245
+ O_STATUS := G_RET_NORMAL ;
246
+
247
+ O_ERROR_NO := G_ERR_NO_SUCCESS ;
248
+
249
+ RETURN ;
250
+
251
+ EXCEPTION
252
+
253
+ WHEN OTHERS THEN
254
+
255
+ O_STATUS := G_RET_SQLERROR ;
256
+
257
+ O_ERROR_NO := SQLCODE ;
258
+
259
+ RETURN ;
260
+
261
+
262
+
263
+ END ZZZZ;
264
+
265
+ END YYYY;
266
+
267
+ /
268
+
269
+
270
+
271
+ ```
272
+
85
273
  ### 試したこと
86
274
 
87
275
  プロシージャ内の処理を空にしても同様のエラーとなったため、おそらくプロシージャコール自体でカーソルを作成しているものと思われます。