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

質問編集履歴

3

試したことを追加

2018/03/23 05:34

投稿

h.t.0210
h.t.0210

スコア6

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

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

2018/03/23 05:34

投稿

h.t.0210
h.t.0210

スコア6

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("yyyy");
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
- String aa = rec.get(0);
29
+ String aa = rec.get(0);
29
- String bb= rec.get(1);
30
+ String bb= rec.get(1);
30
- spq.setParameter(1, aa);
31
+ spq.setParameter(1, aa);
31
- spq.setParameter(2, bb);
32
+ spq.setParameter(2, bb);
32
- // 実行
33
+ // 実行
33
- spq.execute();
34
+ spq.execute();
34
35
 
35
- // エラーチェック
36
+ // エラーチェック
36
- if(...){
37
+ if(...){
37
- tx.rollback();
38
+ tx.rollback();
38
- return;
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

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

2018/03/23 02:55

投稿

h.t.0210
h.t.0210

スコア6

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が増幅していました。