项目场景:
因为数据库的原因所以一些操作需要在oracle进行,然后进行数据同步的时候需要用到调用存储过程
问题描述
本来是想在mysql与oracle之间建立dblink的这样就省下大部分操作只需要改一下表字段就行,可惜不知道什么原因,dblink没有链接成功,所以只能在后端程序里连接oracle数据库调用存储过程了,在此期间遇到了很多坑所以在这记录下来
在后端调用的时候出现的问题有:1.Missing artifact com.oracle:ojdbc6:jar:11.2.0.1.0问题解决 ojdbc包pom.xml出错
2.Missing artifact com.oracle:ojdbc6:jar:11.2.0.1.0问题解决 ojdbc包pom.xml出错
3.pom文件报错
4.mvn不是外部指令
主要是这几个
原因分析:
我先说下遇到问题:至于dblink连接我就不说了,这是路径想了解的可以看一下
oracle通过dblink连接mysql配置详解(全Windows下)_袁清波i的博客-优快云博客
报错就是自己的pom文件的错误例如我自己的:这个报错的话原因是oracle的odbc可能么有安装
第二个报错是连接到存储过程了但是你传的参数跟你oracle接的参数对不上导致的,还有可能是因为oracle数据库内存储过程定义的不对,他里面有一个packages里面和package bodlies这两个文件内的存储过程定义的字段类型及个数也许不对
解决方案:
首先是连接不到oracle数据库的问题,这个需要进行安装这个可以在oracle官网下载,查找跟自己odbc版本一致的安装到你的oracle中jdbc里面的lib目录里然后cmd输入命令:mvn install:install-file -Dfile=/D:/maven/repository/ojdbc6.jar -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0.1.0 -Dpackaging=jar -DgeneratePom=true
这个时候可能会报mvn不是外部或内部命令的错误导致的,你需要在自己电脑上配置环境变量
这两步可以参照这两个连接
https://blog.youkuaiyun.com/qq_41076531/article/details/115868029
第二个报错的解决办法没有什么捷径,就是核对前后端的字段数量及类型
下面是我调用存储过程的方法:
后端:
控制层
业务层:
这里的代码是将传过来的数据获取到,然后连接自己配置文件内的oracle数据库,然后获取数据库的存储过程设置传参的个数,紧接着调用方法,进行set数据
public Object CallEMRPro2(List<HashMap> hz_cx, String hospitalNo, HashMap<String, Object> map, String operateinfo, int operateflag) throws ClassNotFoundException, IOException {
Class.forName("oracle.jdbc.OracleDriver");
try {
Properties properties = new Properties();
ResourceBundle properties1 = ResourceBundle.getBundle("conf.jdbc");
var url= properties1.getString("url");
var username= properties1.getString("username");
var password= properties1.getString(".password");
Connection conn = DriverManager.getConnection(url,username,password);
java.sql.CallableStatement callableStatement = conn.prepareCall("{CALL lwemr.pkg_emr_patient.EMR(?,?,?,?,?)}");
callableStatement.setObject(1, hz_cx.get(0).get("PATIENT_ID"));
callableStatement.setObject(2, hz_cx.get(0).get("VISIT_ID"));
callableStatement.setObject(3, hospitalNo);
callableStatement.setObject(4, operateinfo);
callableStatement.setObject(5, operateflag);
callableStatement.execute();
callableStatement.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return operateflag;
}