質問編集履歴
3
試したことを追加
title
CHANGED
File without changes
|
body
CHANGED
@@ -144,6 +144,8 @@
|
|
144
144
|
### 試したこと
|
145
145
|
プロシージャ内の処理を空にしても同様のエラーとなったため、おそらくプロシージャコール自体でカーソルを作成しているものと思われます。
|
146
146
|
V$OPEN_CURSORを確認したところ、確かに「BEGIN プロシージャ名; END;」というOPENが増幅していました。
|
147
|
+
JPAのStoredProcedureQueryを使わずにjava.sql.CallableStatementで呼び出したら、トランザクションの制御を含めてうまくいきましたので、JPA側の問題ではないかと思います。
|
148
|
+
ただ、コードの統一性を考慮して、実装はあくまでJPAで行いたいと考えています。
|
147
149
|
|
148
150
|
### 補足情報(FW/ツールのバージョンなど)
|
149
151
|
|
2
コードを少し修正しました
title
CHANGED
File without changes
|
body
CHANGED
@@ -13,32 +13,39 @@
|
|
13
13
|
### 該当のソースコード
|
14
14
|
|
15
15
|
```lang-Java
|
16
|
+
try{
|
16
|
-
fac = Persistence.createEntityManagerFactory("xxx");
|
17
|
+
fac = Persistence.createEntityManagerFactory("xxx");
|
17
|
-
em = fac.createEntityManager();
|
18
|
+
em = fac.createEntityManager();
|
18
|
-
tx = em.getTransaction();
|
19
|
+
tx = em.getTransaction();
|
19
20
|
|
20
|
-
StoredProcedureQuery spq;
|
21
|
+
StoredProcedureQuery spq;
|
21
|
-
spq = em.createStoredProcedureQuery("
|
22
|
+
spq = em.createStoredProcedureQuery("YYYY.ZZZZ");
|
22
|
-
spq.registerStoredProcedureParameter(1, Object.class, ParameterMode.IN);
|
23
|
+
spq.registerStoredProcedureParameter(1, Object.class, ParameterMode.IN);
|
23
|
-
spq.registerStoredProcedureParameter(2, Object.class, ParameterMode.IN);
|
24
|
+
spq.registerStoredProcedureParameter(2, Object.class, ParameterMode.IN);
|
24
|
-
spq.registerStoredProcedureParameter(3, Short.class, ParameterMode.OUT);
|
25
|
+
spq.registerStoredProcedureParameter(3, Short.class, ParameterMode.OUT);
|
25
|
-
spq.registerStoredProcedureParameter(4, Short.class, ParameterMode.OUT);
|
26
|
+
spq.registerStoredProcedureParameter(4, Short.class, ParameterMode.OUT);
|
26
|
-
tx.begin();
|
27
|
+
tx.begin();
|
27
|
-
for (List<String> rec : csv) {
|
28
|
+
for (List<String> rec : csv) {
|
28
|
-
|
29
|
+
String aa = rec.get(0);
|
29
|
-
|
30
|
+
String bb= rec.get(1);
|
30
|
-
|
31
|
+
spq.setParameter(1, aa);
|
31
|
-
|
32
|
+
spq.setParameter(2, bb);
|
32
|
-
|
33
|
+
// 実行
|
33
|
-
|
34
|
+
spq.execute();
|
34
35
|
|
35
|
-
|
36
|
+
// エラーチェック
|
36
|
-
|
37
|
+
if(...){
|
37
|
-
|
38
|
+
tx.rollback();
|
38
|
-
|
39
|
+
return;
|
40
|
+
}
|
39
41
|
}
|
42
|
+
tx.commit();
|
43
|
+
}catch(Exception e){
|
44
|
+
throw e;
|
45
|
+
}finally{
|
46
|
+
if(em != null)em.close();
|
47
|
+
if(fac != null)fac.close();
|
40
48
|
}
|
41
|
-
tx.commit();
|
42
49
|
```
|
43
50
|
```lang-SQL
|
44
51
|
CREATE OR REPLACE PACKAGE YYYY
|
1
ストアド定義を追加しました。
title
CHANGED
File without changes
|
body
CHANGED
@@ -40,6 +40,100 @@
|
|
40
40
|
}
|
41
41
|
tx.commit();
|
42
42
|
```
|
43
|
+
```lang-SQL
|
44
|
+
CREATE OR REPLACE PACKAGE YYYY
|
45
|
+
AS
|
46
|
+
/** ステータスコード **/
|
47
|
+
G_RET_NORMAL NUMBER := 0;
|
48
|
+
G_RET_SQLERROR NUMBER := 1;
|
49
|
+
G_RET_PARAMERTER NUMBER := 2;
|
50
|
+
G_RET_DUPLICATION NUMBER := 3;
|
51
|
+
G_RET_NO_EXIST NUMBER := 4;
|
52
|
+
|
53
|
+
/** エラーNO **/
|
54
|
+
G_ERR_NO_SUCCESS NUMBER := 0;
|
55
|
+
G_RET_ERROR NUMBER := 1;
|
56
|
+
|
57
|
+
PROCEDURE ZZZZ
|
58
|
+
(
|
59
|
+
I_AAA IN TABLE_A.AAA%type,
|
60
|
+
I_BBB IN TABLE_A.BBB%type
|
61
|
+
O_STATUS OUT NUMBER,
|
62
|
+
O_ERROR_NO OUT NUMBER
|
63
|
+
);
|
64
|
+
END YYYY;
|
65
|
+
/
|
66
|
+
|
67
|
+
CREATE OR REPLACE PACKAGE BODY YYYY
|
68
|
+
IS
|
69
|
+
PROCEDURE ZZZZ
|
70
|
+
(
|
71
|
+
I_AAA IN TABLE_A.AAA%type,
|
72
|
+
I_BBB IN TABLE_A.BBB%type
|
73
|
+
O_STATUS OUT NUMBER,
|
74
|
+
O_ERROR_NO OUT NUMBER
|
75
|
+
)
|
76
|
+
IS
|
77
|
+
nCOUNT NUMBER := 0;
|
78
|
+
BEGIN
|
79
|
+
/* 入力パラメータチェック */
|
80
|
+
・・・
|
81
|
+
|
82
|
+
/* データ存在チェック */
|
83
|
+
BEGIN
|
84
|
+
SELECT
|
85
|
+
COUNT(1)
|
86
|
+
INTO
|
87
|
+
nCOUNT
|
88
|
+
FROM
|
89
|
+
TABLE_A
|
90
|
+
WHERE
|
91
|
+
AAA = I_AAA
|
92
|
+
AND BBB = I_BBB
|
93
|
+
;
|
94
|
+
EXCEPTION
|
95
|
+
WHEN OTHERS THEN
|
96
|
+
O_STATUS := G_RET_SQLERROR;
|
97
|
+
O_ERROR_NO := SQLCODE ;
|
98
|
+
RETURN ;
|
99
|
+
END ;
|
100
|
+
IF nCOUNT > 0 THEN
|
101
|
+
O_STATUS := G_RET_DUPLICATION;
|
102
|
+
O_ERROR_NO := G_RET_ERROR ;
|
103
|
+
RETURN ;
|
104
|
+
END IF;
|
105
|
+
|
106
|
+
/* データ登録 */
|
107
|
+
BEGIN
|
108
|
+
INSERT INTO
|
109
|
+
TABLE_A
|
110
|
+
(
|
111
|
+
AAA,
|
112
|
+
BBB
|
113
|
+
) VALUES(
|
114
|
+
I_AAA,
|
115
|
+
I_BBB
|
116
|
+
);
|
117
|
+
EXCEPTION
|
118
|
+
WHEN OTHERS THEN
|
119
|
+
O_STATUS := G_RET_SQLERROR;
|
120
|
+
O_ERROR_NO := SQLCODE ;
|
121
|
+
RETURN ;
|
122
|
+
END ;
|
123
|
+
O_STATUS := G_RET_NORMAL ;
|
124
|
+
O_ERROR_NO := G_ERR_NO_SUCCESS ;
|
125
|
+
RETURN ;
|
126
|
+
EXCEPTION
|
127
|
+
WHEN OTHERS THEN
|
128
|
+
O_STATUS := G_RET_SQLERROR ;
|
129
|
+
O_ERROR_NO := SQLCODE ;
|
130
|
+
RETURN ;
|
131
|
+
|
132
|
+
END ZZZZ;
|
133
|
+
END YYYY;
|
134
|
+
/
|
135
|
+
|
136
|
+
```
|
43
137
|
### 試したこと
|
44
138
|
プロシージャ内の処理を空にしても同様のエラーとなったため、おそらくプロシージャコール自体でカーソルを作成しているものと思われます。
|
45
139
|
V$OPEN_CURSORを確認したところ、確かに「BEGIN プロシージャ名; END;」というOPENが増幅していました。
|