Non supported character set: oracle-character-set-852

本文记录了解决在Oracle 11g中使用存储过程遇到的java.sql.SQLException:Nonsupportedcharacterset:oracle-character-set-852异常的过程。通过调整字段类型从VARCHAR2到NVARCHAR2,成功解决了字符集不匹配的问题。

今天在写一个存储过程, 遇到了一个

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)
);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值