我需要编写一个可以从调用Oracle实例调用oracle PL / SQL函数的Java存储过程。
My Java存储过程方法调用以下Java方法
private void WriteToDB(String action, String timestamp, String filename) {
CallableStatement cstmt = null;
try{
String serverIP = "xx.xx.xx";
String portNumber = "yyyy";
String instanceName = "instance1";
String username = "user1";
String password = "password1";
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
String url = "jdbc:oracle:thin:@" + serverIP + ":" + portNumber + ":" + instanceName;
Connection connection = DriverManager.getConnection(url, username, password);
String call = "{ call PACKAGE1.FUNCTION1(?, ?, ?) }";
cstmt = connection.prepareCall(call);
cstmt.setQueryTimeout(1800);
cstmt.setString(1, action);
cstmt.setString(2, timestamp);
cstmt.setString(3, filename);
cstmt.executeUpdate();
}
catch (SQLException e){
WriteEventToLogFile(e.getMessage());
}
finally{
if (cstmt != null){
cstmt.close();
}
}
}
当我从Netbeans IDE运行代码时,它正常运行并执行PL / SQL函数(Pl / SQL函数将记录插入表中)。但是当我将jar加载到oracle并在Oracle中运行存储过程时,该方法似乎没有任何异常执行但没有记录插入到表中,这使我认为PL / SQL函数没有被执行。
另外我的问题是有没有办法在不使用URL的情况下为调用oracle实例创建一个Connection对象(这意味着必须提供我的ip,端口nad实例名称)。
对于这种情况,是否可以使用OracleDriver.getDefaultConnection()?
答案 0 :(得分:0)
我没有看到connection.close()或connection.commit()。你可能想要添加它们。在你的IDE中它工作,因为主程序终止,所以jvm在你的驱动程序上执行finalize方法,它为你关闭连接。如果您在“服务器”上执行(无论在哪里),它不会释放连接。如果你检查数据库会话,它可能仍然在吸烟...
答案 1 :(得分:0)
你可以像这样调用函数
String call =“{SELECT PACKAGE1.FUNCTION1(?,?,?)FROM DUAL}”;