论坛首页 Java企业应用论坛

ibatis调用oracle用户自定义类型怎么写??

浏览 9901 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-05-09  
iBATIS 能不能调用 Oracle 的用户自定义类型呢,调的话怎么调??????

下面是我做的内容:
创建自定义类型 warrant.test_rshan_typ:
create or replace type warrant.test_rshan_typ as object(id VARCHAR2(10),dat VARCHAR2(50));

创建warrant.test_rshan_typ的数组:
create or replace type warrant.test_rshan_typ_arr as table of warrant.test_rshan_typ;

创建调用 warrant.test_rshan_typ 类型的存储过程:
create or replace procedure warrant.shan_test_array(arr in test_rshan_typ_arr,isSuccess out varchar2 )
  as
  begin
      for r in 1..arr.count loop
           insert into test_rshan(id, dat) values(arr(r).id,arr(r).dat);
           if MOD(r,20)=0 then --for transaction control...
              commit;
           end if;

end loop;
commit;
isSuccess:='success';
exception
     when others then
     rollback;
     isSuccess:='unsuccess';
end shan_test_array;

iBATIS调用的部分代码:
<parameterMap class="map" id="shanTestParameters">
	<parameter property="arr" jdbcType="oracleARRAY" javaType="OBJECT" mode="IN"/>
	<parameter property="isSuccess" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT"/>
</parameterMap>

<procedure id="shanTest" parameterMap="shanTestParameters" >
	<![CDATA[ {call warrant.shan_test_array(?,?)}]]>
</procedure>

Java代码:
public static void test() throws SQLException {
		
	Map map = new HashMap();
	Object[][] vals = { { "aaa", "bbb" }, { "aaa1", "bbb1" },
		{ "aaa2", "bbb2" }, { "aaa3", "bbb3" }, { "aaa4", "bbb4" },
		{ "aaa5", "bbb5" } };
	map.put("arr", vals);
		
	try {
		sqlMapper.startTransaction(); 		// 开启事务
		sqlMapper.insert("shanTest", map); 	// 在调用存储过程的方法
		sqlMapper.commitTransaction(); 		// 提交事务
	} catch (SQLException e) {
		e.printStackTrace();
	} finally {
		try {
			sqlMapper.endTransaction(); 	// 结束事务
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

报错:无效的列类型,请问arr怎么配才能行啊
   发表时间:2007-05-09  
我想问题是出在
<parameterMap class="map" id="shanTestParameters">   
    <parameter property="arr" jdbcType="oracleARRAY" javaType="OBJECT" mode="IN"/>   
    <parameter property="isSuccess" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT"/>   
</parameterMap> 

中的这句话:
<parameter property="arr" jdbcType="oracleARRAY" javaType="OBJECT" mode="IN"/>

关键是这句话怎么写!!有可能是 jdbcType 定义有问题。
望各位不吝赐教!!
0 请登录后投票
   发表时间:2007-05-09  
根据ibatis SqlMap2中有描叙自定义类型的应用,和lz用的方式不一样,你改一改试试吧。
那你为什么一定要用自定义的类型呢?你这样的需求不要自定义很好实现呀。
0 请登录后投票
   发表时间:2007-05-09  
公司业务传参很多,计划用自定义类型,我只是做个简单的例子试试。
0 请登录后投票
   发表时间:2007-05-09  
hgq0011 写道
根据ibatis SqlMap2中有描叙自定义类型的应用,和lz用的方式不一样,你改一改试试吧。
那你为什么一定要用自定义的类型呢?你这样的需求不要自定义很好实现呀。


iBATIS的自定义类型好像是返回的数据类型,并不是oracle内部定义的类型。
0 请登录后投票
   发表时间:2007-05-09  
你变型变的比指针还麻烦(说真的没看明白)

不过告诉我你是怎么想的,想要什么样子的东西?
如果你只是想要这个程序过去,
那么把你脑子里所有的动态语言语法全扔了好好的定义变量,再写程序。否则你写出来的就是一堆垃圾
0 请登录后投票
   发表时间:2007-05-09  
需要自己定义一个ArrayTypeHandler
0 请登录后投票
   发表时间:2007-05-09  
qing_pu 写道
公司业务传参很多,计划用自定义类型,我只是做个简单的例子试试。

你用自定义不也要申明数据类型呀,
那还不如按照IBAITS的一般做法。
0 请登录后投票
   发表时间:2007-05-09  
抛出异常的爱 写道
你变型变的比指针还麻烦(说真的没看明白)

不过告诉我你是怎么想的,想要什么样子的东西?
如果你只是想要这个程序过去,
那么把你脑子里所有的动态语言语法全扔了好好的定义变量,再写程序。否则你写出来的就是一堆垃圾

如果说就要这个程序通过,那么应该调些或者再做些什么东西呢??
还有就是有关变量类型的定义:
先定义了一个类型:warrant.test_rshan_typ ,包含了两个属性:id VARCHAR2(10),dat VARCHAR2(50)
然后定义了一个数组类型:warrant.test_rshan_typ_arr,它里面用来存放warrant.test_rshan_typ类型。
最后定义了存储过程:warrant.shan_test_array,接收传入的warrant.test_rshan_typ_arr数据,进行
test_rshan表的操作。以及返回操作结果。
0 请登录后投票
   发表时间:2007-05-09  
dovecat 写道
需要自己定义一个ArrayTypeHandler

有这方面的思路,只不过具体的写法,能给个例子吗??
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics