您好,欢迎访问一九零五行业门户网

Java项目,从Oracle迁移到达梦数据库笔记

达梦数据库是个国产数据库,据说对oracle有很好的兼容,本人亲自从oracle11g迁移到达梦6.0的数据库上来,遇到一些问题,以下是问
达梦数据库是个国产数据库,据说对oracle有很好的兼容,本人亲自从oracle11g迁移到达梦6.0的数据库上来,遇到一些问题,以下是问题记录:
1。字段名错误
虽然达梦sql可以兼容字段大小写,但是jdvc实际上执行与oracle会有差别,
达梦的sql可以执行,但是返回的字段的列名仍然按sql的大小写返回,而oracle会变成全部的大写返回,
select typeid, typename from t_pub_product_type
在用oracle执行后返回的列名叫typeid,typename
达梦返回值则为typeid,typename
比较好的做法是在数据库执行语句之前,强制所有语句转大写:
rs = stmt.executequery(strsql.touppercase());    //达梦数据库对列名区分大小写,oracle会自动全转大写
==============================================
cuont(*)数据类型错误
语句:
select count(*) counts  from t_cus_product left join t_pub_product_type on p_type=typeid where p_createrid=200
oracle的count(*)可以兼容bigdecimal,达梦的count(*)是long型
        //count = ((bigdecimal)mapcount.get(counts)).intvalue();//orcale 为 bigdecimal
        count = ((long)mapcount.get(counts)).intvalue();   //达梦数据库为long
=====================================================
2。达梦数据库语法关键字错误
以下语句oracle 可以执行,达梦却报错误
select c.contractid,contractno, c.contractname, c.type, sum,begin,end
state, userid, serviceid,p_name
from t_contract c
left join t_cus_product
 on c.productid=p_id
  where userid=200 order by contractid
原因:begin,end为达梦的保留关键字,语句修改为双引号的形式,可以通过:
select c.contractid,contractno, c.contractname, c.type, sum,begin,end
state, userid, serviceid,p_name
from t_contract c
left join t_cus_product
 on c.productid=p_id
   where userid=200 order by contractid
=============================================
3。查询dual表报错,
语句:select seq_c006_message_content.nextval from dual
java报错:
java.sql.sqlexception: 无效的表或视图名 'dual'
    at dm.jdbc.dbaccess.dberror.throwsqlexception(unknown source)
    at dm.jdbc.driver.dmdbcsi.preparesql(unknown source)
    at dm.jdbc.driver.dmdbstatement.directexec(unknown source)
    at dm.jdbc.driver.dmdbstatement.executequery(unknown source)
    at cn.org.hz.common.dao.dbaccess.queryonerow(dbaccess.java:110)
    at cn.org.hz.blh.i007.i007blh.i007messageadd(i007blh.java:136)
    at cn.org.hz.blh.i007.i007blh$$fastclassbycglib$$f90d5dcf.invoke()
    at net.sf.cglib.proxy.methodproxy.invoke(methodproxy.java:149)
    at org.springframework.aop.framework.cglib2aopproxy$cglibmethodinvocation.invokejoinpoint(cglib2aopproxy.java:700)
    at org.springframework.aop.framework.reflectivemethodinvocation.proceed(reflectivemethodinvocation.java:149)
    at cn.org.hz.common.aop.aroundinterceptor.invoke(aroundinterceptor.java:13)
    at org.springframework.aop.framework.reflectivemethodinvocation.proceed(reflectivemethodinvocation.java:171)
    at org.springframework.aop.framework.cglib2aopproxy$dynamicadvisedinterceptor.intercept(cglib2aopproxy.java:635)
    at cn.org.hz.blh.i007.i007blh$$enhancerbycglib$$67fbf5f5.i007messageadd()
    at cn.org.hz.ctrl.i007.i007ctrl.i007messageadd(i007ctrl.java:113)
    at sun.reflect.nativemethodaccessorimpl.invoke0(native method)
    at sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:39)
    at sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:25)
    at java.lang.reflect.method.invoke(method.java:597)
    at org.springframework.web.servlet.mvc.multiaction.multiactioncontroller.invokenamedmethod(multiactioncontroller.java:473)
    at org.springframework.web.servlet.mvc.multiaction.multiactioncontroller.handlerequestinternal(multiactioncontroller.java:410)
    at org.springframework.web.servlet.mvc.abstractcontroller.handlerequest(abstractcontroller.java:153)
    at org.springframework.web.servlet.mvc.simplecontrollerhandleradapter.handle(simplecontrollerhandleradapter.java:48)
    at org.springframework.web.servlet.dispatcherservlet.dodispatch(dispatcherservlet.java:875)
    at org.springframework.web.servlet.dispatcherservlet.doservice(dispatcherservlet.java:809)
    at org.springframework.web.servlet.frameworkservlet.processrequest(frameworkservlet.java:571)
    at org.springframework.web.servlet.frameworkservlet.dopost(frameworkservlet.java:511)
    at javax.servlet.http.httpservlet.service(httpservlet.java:710)
    at javax.servlet.http.httpservlet.service(httpservlet.java:803)
    at org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:269)
    at org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:188)
    at cn.org.hz.filter.characterencodingfilter.dofilter(characterencodingfilter.java:23)
    at org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:215)
    at org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:188)
    at org.apache.catalina.core.standardwrappervalve.invoke(standardwrappervalve.java:213)
    at org.apache.catalina.core.standardcontextvalve.invoke(standardcontextvalve.java:174)
    at org.apache.catalina.core.standardhostvalve.invoke(standardhostvalve.java:127)
    at org.apache.catalina.valves.errorreportvalve.invoke(errorreportvalve.java:117)
    at org.apache.catalina.core.standardenginevalve.invoke(standardenginevalve.java:108)
    at org.apache.catalina.connector.coyoteadapter.service(coyoteadapter.java:151)
    at org.apache.coyote.http11.http11processor.process(http11processor.java:874)
    at org.apache.coyote.http11.http11baseprotocol$http11connectionhandler.processconnection(http11baseprotocol.java:665)
    at org.apache.tomcat.util.net.pooltcpendpoint.processsocket(pooltcpendpoint.java:528)
    at org.apache.tomcat.util.net.leaderfollowerworkerthread.runit(leaderfollowerworkerthread.java:81)
    at org.apache.tomcat.util.threads.threadpool$controlrunnable.run(threadpool.java:689)
    at java.lang.thread.run(thread.java:619)
解决在本用户下建立一个dual同义词
如果需要直接访问,可以用sysdba创建一个public同义词:
create public synonym dual for system.sysdba.sysdual;
达梦虽然在sysdba下造了一个dual表来兼容oracle但是却没有在每个新用户下建立同义词,,所有一般对dual表的查询都会报错。
=================================================
其它类似信息

推荐信息