在 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);
没有数据库Connection
s,CallableStatement
s 可以在任何地方看到。迷人的!哦对了,它还提供了基于注解的Transaction
s。
如果您的存储过程返回一个表,那么使用 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 慢?