java调用带有%rowtype参数的oracle过程

时间:2013-11-25 10:04:39

标签: java oracle stored-procedures rowtype

我已经使用in out参数%rowtype给出了一个oracle过程,如:

CREATE OR REPLACE PROCEDURE cleansing(
       io_user IN OUT USER%rowtype
)
IS
BEGIN
  --some pl/sql code

END cleansing;

USER是一个超过 100列的表,我想通过Java调用该过程。 我无法更改程序,因为它们已被其他项目使用。 我无法向数据库添加过程,因为我没有权限这样做。 我谷歌它,但找不到一个好方法来处理这个。 我想做的是: 1.传递参数。 2.获取参数。一些java演示代码:

String sql = "{call cleansing(?)}";
try {
    dbConnection = getDBConnection();
    callableStatement = dbConnection.prepareCall(sql);
    callableStatement.setXXX()//I don't know
    callableStatement.registerOUTParameter(1, //I don't know the type.);

任何人都可以帮助我并提供一些演示代码吗?没有改变数据库和用java的参数映射

1 个答案:

答案 0 :(得分:2)

这是可能的,但并不是那么简单。您必须在运行时创建USER%ROWTYPE类型的东西,并使用它来调用您的存储过程。有关详细信息,请查看here

要获得输出值,您还必须按照Sumit的注释行做一些额外的操作。基本上,在程序调用之后,打开一个光标,从USER参数中选择相关数据。

所以你得到一个数据库语句如下(伪代码):

string sql =
   "declare
        user_param user%rowtype;
    begin
        -- Set necessary parameters 
        user_param.col0 := :p0In;
        user_param.col1 := :p1In;
        ...

        -- Call procedure.
        cleansing(io_user => user_param);

        -- Read necessary output values into cursor.
        open :pOut for select user_param.col99 as col99
                              user_param.col98 as col98
                              ...
                       from dual;
    end;"

你以通常的方式调用整个语句,但你注册了一个游标输出参数(不幸的是,Java很久以前对我来说,所以我不确定确切的语法)。

callableStatement.registerOutParameter("pOut", OracleTypes.CURSOR);
...
callableStatement.execute();
...
ResultSet rs = (ResultSet) callableStatement.getObject("pOut");
// Read from result set.

编辑:我把它变成blogpost。代码示例在C#中,但想法是一样的。