【问题标题】:Launch Oracle stored-procedure in Java code在 Java 代码中启动 Oracle 存储过程
【发布时间】:2010-11-24 09:11:37
【问题描述】:

我在 Oracle 中编写了一个存储过程,现在我想用 Java 代码启动它。 我将描述一个问题。我有一个对象类型:

TYPE PERSON_TYPE AS OBJECT (ID NUMBER(38), NAME VARCHAR2(20));

和表类型:

TYPE PERSON_TYPE_TABLE AS TABLE OF PERSON_TYPE;

我的程序如下所示:

PROCEDURE EVALUATE_PERSON_PROC(P_PERSON_ID IN NUMBER, return_data OUT NOCOPY PERSON_TYPE_TABLE) 
AS
--Some code
BEGIN
--Some code
END;

如何在 Java 代码中启动这个程序?哪些课程最适合?

【问题讨论】:

    标签: java oracle stored-procedures jdbc plsql


    【解决方案1】:

    您需要使用CallableStatement class:

    String sql = "{call EVALUATE_PERSON_PROC(?, ?)}";
    CallableStatement statement = connection.prepareCall(sql);
    ...
    statement.execute();
    

    【讨论】:

    • +1。我还怀疑作者需要一些关于返回表类型的文档:stackoverflow.com/questions/1031420/…
    • 是的,我知道。但是我在 PL/SQL 中创建的类型怎么办?如何配置返回我的类型集合的 CallableStatement?
    【解决方案2】:

    为什么不使用Spring's DAO abstraction(一个非常有用且相当轻量级的,围绕原始 JDBC 消除了对样板代码的需要),您可以将StoredProcedure 类作为子类。

    class MySproc extends StoredProcedure {
        public MySproc(DataSource ds) {
           super(" { exec MY_SPROC ?, ? }", ds);
           declare(new SqlParameter("p1", Types.VARCHAR));
           declare(new SqlParameter("p2", Types.INT));
        }
    
        public void execute(String p1, int p2) {
            Map m = new HashMap();
            m.put("p1", p1);
            m.put("p2", p2);
            super.execute(m);
        }
    }
    

    那么就很简单的执行如下:

    new MySproc(ds).execute("Hello", 12);
    

    没有数据库Connections,CallableStatements 可以在任何地方看到。迷人的!哦对了,它还提供了基于注解的Transactions。

    如果您的存储过程返回一个表,那么使用 Spring 非常容易。简单声明:

           declare(new SqlReturnResultSet("rs", mapper));
    

    其中mapper 是将ResultSet 的一行转换为所需对象的实例。然后修改你的行:

            Map out = super.execute(m);
            return (Collection) out.get("rs");
    

    返回的Collection 将包含由您的mapper 实现创建的对象实例。

    【讨论】:

    • 大概是这样的说法,在项目中引入spring库是无稽之谈。还有一种情况,作者可以决定将代码直接部署到 Oracle DBMS,而 spring 会带来很多痛苦。
    猜你喜欢
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 2016-03-03
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    相关资源
    最近更新 更多