在 Java 代码中启动 Oracle 存储过程

Posted

技术标签:

【中文标题】在 Java 代码中启动 Oracle 存储过程【英文标题】:Launch Oracle stored-procedure in Java code 【发布时间】: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 代码中启动这个程序?哪些课程最适合?

【问题讨论】:

【参考方案1】:

您需要使用CallableStatement class:

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

【讨论】:

+1。我还怀疑作者需要一些关于返回表类型的文档:***.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 会带来很多痛苦。

以上是关于在 Java 代码中启动 Oracle 存储过程的主要内容,如果未能解决你的问题,请参考以下文章

为啥 oracle 存储 java 过程中的相同代码可能比普通 java 慢?

在 Oracle 中调用 Java 存储过程

oracle存储过程

Java:在 oracle 数据库中调用存储过程

Oracle03——游标异常存储过程存储函数触发器和Java代码访问Oracle对象

Oracle调用Java类开发的存储过程函数的方法