使用Java代码启动Oracle存储过程

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代码中启动此过程?哪个班级最好?

Rom*_*las 8

您需要使用CallableStatement类:

String sql = "{call EVALUATE_PERSON_PROC(?, ?)}";
CallableStatement statement = connection.prepareCall(sql);
...
statement.execute();
Run Code Online (Sandbox Code Playgroud)


oxb*_*kes 8

为什么不使用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实现创建的对象的实例.