今天在写一个存储过程, 遇到了一个
java.sql.SQLException: Non supported character set: oracle-character-set-852 异常:
网友说: 将 nls_charset12.jar 加入到 classpath 中。
本人加入了, 无果。
===========================
另外说一下: oracle 版本 11g
驱动 ojdbc14.jar || jdk 1.6
============================
=============================
存储过程是这么定义的:
create or replace type emptype as object
(
eno number(4),
ename varchar2(20)
);
CREATE OR REPLACE PROCEDURE "PRO_ADD_EMP2" (emp in EMPTYPE, ref_cur out sys_refcursor)
is
begin
open ref_cur for
select emp.eno || ' + 111',emp.ename || ' world !!!' from dual;
end pro_add_emp2;
然后再客户端是这样子调用的:
=================================
CallableStatement cstmt = (OracleCallableStatement) conn.prepareCall("{call PRO_ADD_EMP2(?,?) }");
// 参入参数
Object[] obj = new Object[]{123,"hello"};
StructDescriptor ad = StructDescriptor.createDescriptor("EMPTYPE", conn);
STRUCT arr = new STRUCT(ad,conn,obj);
cstmt.setObject(1, arr);
cstmt.registerOutParameter(2, OracleTypes.CURSOR);
cstmt.execute();
ResultSet rs = (ResultSet) cstmt.getObject(2);
while(rs.next()){
System.out.println(rs.getString(1));
System.out.println(rs.getString(2));
}
=========================================
最后看了这么一篇评论:
--------------------------
http://unixboy.javaeye.com/blog/167807
我运行的时候发现NUMBER型 的可以插入,VARCHAR2类型的就不行!
我改了一下!
CREATE TYPE department_type AS OBJECT (
DNO NUMBER (10),
NAME VARCHAR2 (50),
LOCATION VARCHAR2 (50)
);
改成:
CREATE TYPE department_type AS OBJECT (
DNO NUMBER (10),
NAME nVARCHAR2 (50),
LOCATION nVARCHAR2 (50)
);
然后就可以了!
不过我不知道为什么这么改就没问题!
======================================
于是乎 我将我的 emptype 中定义 varchar 改为 nvarchar
竟然成功了
create or replace type emptype as object
(
eno number(4),
ename nvarchar2(20)
);