Mic*_*ber 2 java oracle plsql stored-procedures jdbc
我在Oracle中编写了一个存储过程,现在,我想用Java代码启动它.我将描述一个问题.我有一个对象类型:
TYPE PERSON_TYPE AS OBJECT (ID NUMBER(38), NAME VARCHAR2(20));
Run Code Online (Sandbox Code Playgroud)
和表类型:
TYPE PERSON_TYPE_TABLE AS TABLE OF PERSON_TYPE;
Run Code Online (Sandbox Code Playgroud)
我的程序看起来像这样:
PROCEDURE EVALUATE_PERSON_PROC(P_PERSON_ID IN NUMBER, return_data OUT NOCOPY PERSON_TYPE_TABLE)
AS
--Some code
BEGIN
--Some code
END;
Run Code Online (Sandbox Code Playgroud)
如何在Java代码中启动此过程?哪个班级最好?
您需要使用CallableStatement类:
String sql = "{call EVALUATE_PERSON_PROC(?, ?)}";
CallableStatement statement = connection.prepareCall(sql);
...
statement.execute();
Run Code Online (Sandbox Code Playgroud)
为什么不使用Spring的DAO抽象(一个围绕原始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);
}
}
Run Code Online (Sandbox Code Playgroud)
然后执行非常简单如下:
new MySproc(ds).execute("Hello", 12);
Run Code Online (Sandbox Code Playgroud)
没有数据库Connection,无处CallableStatement可见.可爱!哦,是的,它还提供基于注释Transaction的.
如果您的sproc返回一个表,使用Spring非常容易.简单声明:
declare(new SqlReturnResultSet("rs", mapper));
Run Code Online (Sandbox Code Playgroud)
mapper将一行ResultSet转换为所需对象的实例位于何处.然后修改你的行:
Map out = super.execute(m);
return (Collection) out.get("rs");
Run Code Online (Sandbox Code Playgroud)
返回的Collection将包含由您的mapper实现创建的对象的实例.
| 归档时间: |
|
| 查看次数: |
2905 次 |
| 最近记录: |