[CONTAINER-26] ストアド利用するとき、オラクルのNUMBERをJavaのBigDecimalに変換できません。 Created: 2006-12-15  Updated: 2006-12-17  Resolved: 2006-12-17

Status: Closed
Project: S2Container
Component/s: S2Container
Affects Version/s: 2.3.12
Fix Version/s: None

Type: Bug Priority: Major
Reporter: lijun Assignee: higa
Resolution: Won't Fix Votes: 0
Labels: None
Environment:

Client:WinXP+Eclipse3.2+S2Container 2.3.12+JDK1.5.0.07
Server:Win2003+Oracle9i



 Description   

S2DAOでオラクルのストアドを呼出して、ストアドで設定済みのOUTオブジェクトを
javaのDTOに変換しますが、NUMBERをBigDecimalを変換するところ、Exceptionが
Throwされました。

また、2.3.12版のorg.seasar.framework.util.BigDecimalConversionUtil.toBigDecimalクラス
と2.4.6版実装が違いますが、同様の結果になっています。

Debugしてみて、該当メソッドに、下記のような処理が必要のようです。
else if (o instanceof NUMBER){
try

{ return ((NUMBER)o).bigDecimalValue(); }

catch(SQLException e)

{ return null; }

エラースタック:
org.seasar.framework.beans.IllegalPropertyRuntimeException:
  ・・・理由はjava.lang.NumberFormatException
・・・省略・・・
at java.math.BigDecimal.<init>(BigDecimal.java:647)
at org.seasar.framework.util.BigDecimalConversionUtil.toBigDecimal(BigDecimalConversionUtil.java:68)
at org.seasar.framework.util.BigDecimalConversionUtil.toBigDecimal(BigDecimalConversionUtil.java:30)
at org.seasar.framework.util.NumberConversionUtil.convertNumber(NumberConversionUtil.java:30)
・・・省略・・・

ストアドイメージ:
 my package#my function(in inData ユーザ定義タイプ,out outData ユーザ定義タイプ)
ユーザ定義タイプ:
( A NUMBER、B DATE C VARCHAR2)



 Comments   
Comment by Anonymous [ 2006-12-17 ]

ありがとうございました。
Seasar-user ML で質問させてください。

Comment by koichik [ 2006-12-16 ]

NUMBER は Oracle 固有の型であるため Seasar2 に上記のコードを含めることはできません.
対応は S2Dao のストアドサポートも含めて検討する必要があると思うので Seasar-user ML で質問してください.

Comment by Anonymous [ 2006-12-16 ]

オラクル側のソース:
1)ユーザ定義タイプ
create or replace type test_msg_rectype as object
(
seq_no DATE,
seq_sub_no NUMBER,  
tran_flg VARCHAR2(1)
)
2)ファンクション:
CREATE OR REPLACE PACKAGE BODY test AS
FUNCTION test_func
(
i_msg_rec IN test_msg_rectype,
o_msg_rec OUT test_msg_rectype
)
RETURN NUMBER IS
BEGIN
  o_msg_rec:= NEW test_msg_rectype(seq_no => '',seq_sub_no => '',tran_flg => '');
o_msg_rec.seq_no := SYSDATE;
o_msg_rec.seq_sub_no :=100.123; --ほかの値(100なども同様)
o_msg_rec.tran_flg := 'C';
RETURN 0;
END;

Java:
1)DTO定義:
public class testMsgRectypeDto implements Serializable {
public static final String seqNo_COLUMN = "SEQ_NO";
public static final String seqSubNo_COLUMN = "SEQ_SUB_NO";
public static final String tranFlg_COLUMN = "TRAN_FLG";

private java.util.Date seqNo;
private BigDecimal seqSubNo;
private String tranFlg;
・・・省略・・・

2)DAO定義:
public interface LogTestDao {
public static final Class BEAN = testMsgRectypeDto.class;
public static final String test_PROCEDURE = "test.test_func";
public Map test(
testMsgRectypeDto inDto,testMsgRectypeDto outStr);
}

3)DAOTest定義:
public class LogDaoTest extends S2DaoTestCase {
・・・省略・・・
public void testTx() {

testMsgRectypeDto inDto = new testMsgRectypeDto();
inDto.setSeqNo(new Date("200/06/01"));
inDto.setSeqSubNo(new BigDecimal(1));
inDto.setTranFlg("2");

testMsgRectypeDto outDto = new testMsgRectypeDto();

try{
Map rtn = this.dao_.test(inDto,outDto);
testMsgRectypeDto out = (testMsgRectypeDto)rtn.get("O_MSG__REC");
System.out.print(out.getSeqSubNo());
}
・・・省略・・・

一応org.seasar.framework.util.BigDecimalConversionUtil.toBigDecimalに
下記のコートを追加したら問題なく返却できたようですが、ほかに何か影響があるかわかりません。
else if (o instanceof NUMBER){
try

{ return ((NUMBER)o).bigDecimalValue(); }

catch(SQLException e)

{ return null; }
Comment by koichik [ 2006-12-15 ]

変換できなかった数値の型とその値は何でしょうか?

Generated at Mon Dec 15 17:30:50 JST 2025 using Jira 10.6.1#10060001-sha1:a6461e220f274b29ced7ac9295492f2465fe5ef5.