【问题标题】:Calling PL/SQL package code in a Java Program在 Java 程序中调用 PL/SQL 包代码
【发布时间】:2014-12-18 03:08:29
【问题描述】:

我正在尝试在 Java 程序中调用使用 PL/SQL 包定义的过程。

我知道可以在 Jdbc 中使用 connection.prepareCall 调用存储过程。但是关于如何在包中调用过程的信息很少。

我正处于开发阶段,我仍在考虑使用什么数据库框架。 只是想知道将 JDBC 用于 PLSQL 的优缺点是什么?对于这个用例,有没有更好的 JDBC 替代品?

【问题讨论】:

    标签: java oracle jdbc plsql package


    【解决方案1】:

    按照以下简单步骤操作:

    public static final String SOME_NAME = "{call   schema_name.org_name_pkg.return_something(?,?)}"; // Change the schema name,packagename,and procedure name.
    
    // Simple JDBC Connection Pooling
    // Here I am passing param companyId which is IN param to stored procedure which will return me some value.
    
    Connection conn = null;
    CallableStatement stmt = null;
    ResultSet rset = null;
    
    try {
            conn = DriverManager.getConnection("jdbc:mysql://hostname:port/dbname","username", "password");
            stmt = conn.prepareCall(SOME_NAME);//We have declared this at the very top
            stmt.setString(1, companyid);//Passing CompanyID here
            stmt.registerOutParameter(2, OracleTypes.CURSOR);//Refcursor selects the row based upon query results provided in Package.
            stmt.execute();
            rset = (ResultSet) stmt.getObject(2);
    
            while (rset.next()) {
                String orgId=rset.getString("RPT_ORG_ID"); 
                // When using refcursor easy to get the value just by using Column name     
                String orgName=rset.getString("RPT_ORG_NAME");    
                // Some Logic based what do you want to do with the data returned back from query
    } catch (Exception e) {
            LOGGER.error("Error extracting ", e);
    } finally {
            DBUtils.cleanUp(conn, stmt, rset);
    }
    
    // Clean and close you connection
    

    【讨论】:

    • 谢谢!!您似乎正在使用 Apache 的 DbUtils。在普通 Jdbc 上使用它是否有特定原因。
    • 对不起,我是从我自己的工作项目中复制过来的。请忽略这一点,我已经更新了代码。您需要添加一些代码,例如 try 和 catch 块以及清理和关闭连接。希望你不介意硬解释。
    • 使用 pl/sql 而不是直接在 java 代码中公开 sql 是一种非常安全的做法。其次,使用 pl/sql 你不必多次调用 db,这样会更快。
    • 似乎 jdbc 是一个低级 API,还有其他高级 API,如 EJB、hibernate 或 JPA。例如,我可以使用 JPA 或 Hibernate 来调用 PL/SQL 过程吗?我的意思是 PL/SQL 是 oracle 的过程语言。
    • 没错,有各种 API 可以替代 JDBC。这一切都取决于您的项目架构、框架和要求。如果您使用的是 jdbc,我希望上面的代码 sn-p 对您有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多