1.说明
【区别:(1)调用Oracle存储过程;(2)调用Oracle函数】
之前在Java实现使用JDBC调用Oracle的存储过程时,也遇到了这个问题,然后使用之前调用Oracle存储过程的解决办法无法解决当前的问题,故只能寻找新的解决办法。
之前解决调用Oracle存储过程的解决方法:https://blog.csdn.net/Sir_viter/article/details/107212577
2.问题
Exception in thread "main" java.sql.SQLException: ORA-06550: 第 1 行, 第 13 列:
PLS-00201: 必须声明标识符 'FINDCLASSINFOYEARSAL'
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:450)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:399)
………………省略………………
3.分析
由于之前做过了调用Oracle存储过程的例子,一看就知道是权限问题,但是在使用原来的解决办法时却行不通。
4.解决办法
Class.forName("oracle.jdbc.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "SYS as sysdba", "XXX密码信息XXX");
CallableStatement call=conn.prepareCall("{? =call findClassinfoYearSal(?,?,?)}");
call.registerOutParameter(1, oracle.jdbc.OracleTypes.NUMBER);
call.setString(2, "003");
call.registerOutParameter(3, oracle.jdbc.OracleTypes.VARCHAR);
call.registerOutParameter(4, oracle.jdbc.OracleTypes.NUMBER);
即,在SYS帐号后面,添加了 as sysdba,问题即得到解决(之前使用的是SCOTT帐号,使用SYS.函数名的方式调用也不行)。
5.结果
连接成功,调用成功。