SQLJ技术的使用本文不进行相关介绍,如果是想要学习的朋友可以在网上搜索一下,很多资料都有介绍。
本文主要是说明已使用SQLJ技术的应用,由于数据编码设置为GBK后程序中获取的数据乱码的解决方案。
情况说明:
数据库的字符集编码设置为:ZHS16GBK
应用程序调用数据库中的存储过程,注册的出参为ORACLE自定义的TYPE或OBJECT类型,存诸过程调用后,获取出参中的数据时,数据库中定义为VARCHAR2类型的数据都为乱码,但数值型是正常的。
以上情况,包括使用SQLJ或直接使用oracle.sql.STRUCT进行获取,获取方式代码片段如下:
JdbcTemplate jdbcTemplate = getJdbcTemplate();
OracleCallableStatement proc = null;
Connection conn = null;
String adjustFlag = "";
CharacterSet dbCharset = CharacterSet.make(CharacterSet.ZHS16GBK_CHARSET);//用于进行转码
try {
conn = jdbcTemplate.getDataSource().getConnection();
proc = (OracleCallableStatement)conn
.prepareCall("{ call MyProc(?, ?, ?, ?, ?, ?, ?) }"); // 调用存储过程
proc.registerOutParameter(6, Types.VARCHAR); // 注册输出参数,就是返回值,成功标志.
proc.registerOutParameter(7, OracleTypes.ARRAY, "ARR_REPLAN"); // 注册输出参数,就是返回值,类型为数组
proc.setString(1,grPropPlanAdjDto.getCertiNo());
proc.setBigDecimal(2,new BigDecimal(grPropPlanAdjDto.getDangerUnitNo().doubleValue()));
proc.setString(3,grPropPlanAdjDto.getReRiskCode());
proc.setString(4,grPropPlanAdjDto.getRiskCode());
proc.setDate(5,new java.sql.Date(grPropPlanAdjDto.getStartDate().getTime()));
proc.execute(); // 执行
adjustFlag = proc.getString(6); // 接收返回值
Array arrReplan = proc.getArray(7); // 接收返回值
Object[] objArr = (Object[])arrReplan.getArray();
for(Object obj : objArr) {
STRUCT s = (STRUCT)obj;
for(int i=0; i<s.getAttributes().length; i++){
CHAR value = new CHAR(String.valueOf(s.getAttributes()[i]).getBytes(), dbCharset);
System.out.println("===="+s.getAttributes()[i]);
System.out.println("===="+value);
}
for(int i=0; i<s.getOracleAttributes().length; i++){
CHAR value = new CHAR(s.getOracleAttributes()[i], dbCharset);
System.out.println("===="+s.getOracleAttributes()[i]);
System.out.println("===="+value);
}
}
}
finally {
if(proc!=null){
try{
proc.close();
}catch(Exception e){
}
}
if(conn != null){
try {
conn.close();
}
catch(SQLException e) {
}
}
}
return null;
}
乱码解决方法:
取%WEBLOGIC_HOME%\wlserver_10.3\server\ext\jdbc\oracle\11g目录下的orai18n.jar,然后放到weblogic使用的JDK的jre/lib/ext目录下,或者修改weblogic的启动脚本,把这个jar添加到classpath中。如果添加此jar包后,启动报错说明原有的JDBC驱动jar包的版本太低,需要换成ojdbc6.jar,同样在与orai18n.jar的目录中,WEBLOGIC也提供了ojdbc6.jar文件,复制出来,与orai18n.jar放到一起,确保WEBLOGIC启动时,加载到此JAR。
注:orai18n.jar这个文件,一定要用自己的WEBLOGIC下带的,否则有可能乱码问题不能解决。
分享到:
相关推荐
JAVA SQLJ 开发指南
SQLJ:是一个JAVA预编译器,它可以将内嵌的SQL语句转化为JAVA语句.SQLJ的使用与运行机理与其它ORACLE的与编译器类似。实际上,为了使我们形象的记住SQLJ提供的功能,我们也可以直接将SQLJ改名为Pro*Java。
Java Programming With Oracle Sqlj。 <br>详细说明,介绍。通后学习如何用 SQLJ 取代 JDBC 开发模式。 例子说明: int v_id = 1; String v_name = null; float v_price = 0.0; PreparedStatement...
NULL 博文链接:https://lspgdut.iteye.com/blog/1931861
具体介绍了Java消息处理和图像生成工具,协同使用PL/SQL和Java的方法,操作系统资源的使用,优化Java应用程序的性能,SQL在PL/SQL和Java中的执行基准,Oracle JDBC和 SQLJ等内容。给PL/SQL程序员提供了Java教程。...
Oracle9i SQLJ程序设计,就那个老外的,找着了,还没看呢,现分享下哈
具体介绍了Java消息处理和图像生成工具,协同使用PL/SQL和Java的方法,操作系统资源的使用,优化Java应用程序的性能,SQL在PL/SQL和Java中的执行基准,Oracle JDBC和 SQLJ等内容。给PL/SQL程序员提供了Java教程。...
更多>> Describes Oracle’s Internet Computing Platform for developing applications.Outlines Key Oracle Java technologies like Enterprise Java Beans,Business Components, Java Server Pages, and Servlets...
there is guide line for develpoer for how to use the complex sqlj sentense.
基于Oracle数据库的JDBC与SQLJ的研究.pdf
Java中的嵌入式SQL技术:SQLJ.pdf
Oracle 9i SQLJ Developer’s Guide and Reference Release 2 (9.2)
Oracle Database SQLJ Developer’s Guide 11g Release 2 (11.2)-482
jdbc_sqlj , 自己去IBM官方注册下载下来的,绝对正版。。可以使用,快来下载吧! db2_db2driver_for_jdbc_sqlj版本官网安装程序包
SQLJ 简介 什么是SQLJ 准备开始 使用SQLJ SQLJ定制 小结 第9章 数据库性能问题 本地编译机制 挑选适当的JDBC驱动程序 连接池 事务和批量查询 存储过程和JDBC准备语句 JDBC...
SQLJ知识演示文稿
该系统是使用SQLJ的oracle报刊管理系统,可对报刊进行管理
SQL server 数据库驱动 SQL server 数据库驱动
这是一个jar包sql2000 的你可以java和sql连接数用的谢谢