通过java调用Oracle pl / sql函数

时间:2013-12-11 11:39:18

标签: java sql oracle plsql

我需要编写一个可以从调用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()?

2 个答案:

答案 0 :(得分:0)

我没有看到connection.close()或connection.commit()。你可能想要添加它们。在你的IDE中它工作,因为主程序终止,所以jvm在你的驱动程序上执行finalize方法,它为你关闭连接。如果您在“服务器”上执行(无论在哪里),它不会释放连接。如果你检查数据库会话,它可能仍然在吸烟...

答案 1 :(得分:0)

你可以像这样调用函数

  

String call =“{SELECT PACKAGE1.FUNCTION1(?,?,?)FROM DUAL}”;